2011-03-27 86 views
1

我使用新的EF代碼首先向我的一個項目,我得到一個奇怪的錯誤,我的方式是:實體框架代碼優先 - 無法插入重複鍵對象「DB」

abstract class Member 
{ 
    public virtual int MemberId; 
    ... some other stuff 

} 

class User : Member 
{ 
    public virtual string Name; 
    ... some more props no new key defined 
} 

class MyDbContext 
{ 
    public DbSet<User> Users {get;set;} 
} 

部署到SQL Server的結果就好了,我有一個成員表和一個用戶表(TPC)。 現在在我的主,我下面的代碼:

static Main() 
{ 
    User x,y; 
    using(MyDbContext ctx = new MyDbContext()) 
    { 


    x = ctx.Users.Create(); 
    y = ctx.Users.Create(); 
    x.Name = "SomeUser"; 
    y.Name = "SomeUser2"; 
    ctx.SaveChanges(); 

    } 
} 

在保存更改我得到:

「未處理的異常: System.Data.Entity.Infrastructure.DbUpdateException: 出錯同時更新 條目請參閱 detail的內部例外---> System.Data.UpdateException:在更新條目時發生了錯誤 有關詳細信息,請參閱內部例外 ---> System.Data.SqlClient.SqlException:違反PRIMARY KEY約束 'PK_ 用戶 _0CF04B1821B6055D'。可在對象 「dbo.Users」。」

的成員Id在默認情況下不 插入重複鍵的身份,所以我只是沒有看到什麼是怎麼回事。我試圖創建一個新的實例和它們連接?上下文但錯誤是一樣的,任何想法 數據庫是空的

感謝

編輯:!忘了說,會員是一個抽象類對不起回合,

回答

2

我剛剛在TPC (表具體類型的表)中測試了它和派生類型的表繼承在EF 4.1 RC中沒有將PK定義爲標識。

+0

這是真的,但會員表有一個身份PK,所以它應該自動執行綁定 – DVD 2011-03-27 19:07:43

+0

不,它不應該因爲它是每個具體類型的表。每個表處理自己的PK。此外,身份列不應該用於TPC繼承,因爲如果您查詢所有成員,它也會返回用戶。如果你不改變種子的身份,你將很容易得到具有相同ID的用戶和會員。在這種情況下,我期待例外。 – 2011-03-27 19:10:00

+0

它是有道理的,事情是,我有一些共同的信息(成員)和一些其他具體的信息(例如用戶,管理員,訪客)我已經映射成員到表,因爲如果我想知道一些成員名稱我不需要知道它是一個用戶還是管理員等等。關鍵是用戶是一個直接成員,所以不可能有相同的ID ...成員也是一個抽象類,所以我甚至不能創建實例。 。 。 – DVD 2011-03-27 19:16:14

1
  1. MemberId是否自動添加?
  2. 您是否檢查過您創建的用戶的標識(以console.Writeline爲例)?
  3. 請問,如果你做的工作如下:

    x = ctx.Users.Create();   
    x.Name = "SomeUser";   
    ctx.SaveChanges();   
    y = ctx.Users.Create();   
    y.Name = "SomeUser2";   
    ctx.SaveChanges(); 
    

你應該嘗試之前對其進行修改,以附上您的實體。

+0

沒有這行得上班,性質成員Id是身份,因此不應該在插入查詢。 。 。 id始終爲0,這是問題所在,但是當我提交更改時,EF應該自動更改proxys MemberId – DVD 2011-03-27 15:15:20

+0

您應該在修改它之前嘗試附加您的實體。 – 2011-03-27 15:16:35

+0

它給出了具有相同問題的其他例外,「已經存在具有相同密鑰的對象」... – DVD 2011-03-27 15:20:44

1

我剛碰到這個。與標記的回答狀態一樣,TPC沒有將密鑰設置爲身份。所以,你可以使用註解吧:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int ID { get; set; }