Dot-Net

實體框架 - 已添加具有相同鍵的項目。- 嘗試定義外鍵關係時出錯

  • August 29, 2010

我有一個與 asp.net 成員提供者使用者表有外鍵關係的實體。

模型的這一部分如下所示:

替代文字

插入使用者表記錄時,我似乎無法分配外鍵關係,該記錄包含aspnet_Users表的外鍵。我不斷收到錯誤:

已添加具有相同密鑰的項目。

我正在使用的程式碼如下所示:

UserAdmin userToAdd = new UserAdmin();
...
userToAdd.aspnet_Users = membershipUser;
//line above OR line below
userToAdd.aspnet_UsersReference.EntityKey = new System.Data.EntityKey("ProjectEntities.aspnet_Users", "UserId", membershipUser.UserId);

db.AddToUsers(userToAdd);
db.SaveChanges();

當該記錄已經存在時,我要求 EF 添加新aspnet_Users表記錄(關聯主鍵表的記錄)的問題是什麼?

如何將外鍵值分配給已經存在主鍵記錄的實體?

更新的測試程式碼塊:

MembershipUser membershipUser = Membership.CreateUser("blah@blah.com", "pass", "blah@blah.com");

Entities db = new Entities();
UserAdmin newUser = new UserAdmin();
newUser.Name = "blah";
newUser.DateAdded = DateTime.Now;

Guid key = new Guid(membershipUser.ProviderUserKey.ToString());
aspnet_Users membershipUserRecord = db.aspnet_Users.Where(u => u.UserId == key).FirstOrDefault();
newUser.aspnet_Users = membershipUserRecord;
//newUser.aspnet_UsersReference.EntityKey = new System.Data.EntityKey("Entities.aspnet_Users", "UserId", membershipUserRecord.UserId);
db.ObjectStateManager.ChangeObjectState(membershipUserRecord, EntityState.Unchanged);

db.AddToUsers(newUser);
db.SaveChanges();

此程式碼生成錯誤:

已添加具有相同密鑰的項目。

好的,我想出了這個。像往常一樣,只是我犯了一個錯誤,沒有馬上抓住它,因為我找錯了地方。

問題是由於我的表繼承和數據庫級別的配置。我將子表的(UserAdmin)外鍵欄位定義為身份,然後在我的模型中顯示為 StoreGeneratedPattern = Identity。當 EF 嘗試將父項的主鍵傳播到其子項的外鍵欄位時,這會導致“已添加具有相同鍵的項目錯誤”。

一旦我從 UserAdmins 表中刪除了身份規範,問題就消失了。

問題解決了。

引用自:https://stackoverflow.com/questions/3594236