7

我有一個具有與asp.net成員資格提供程序用戶表的外鍵關係的實體。實體框架 - 已添加具有相同密鑰的項目。 - 嘗試定義外鍵關係時出錯

模型的這一部分看起來是這樣的:

alt text

我似乎無法插入用戶表記錄,包含外鍵aspnet_Users表中的記錄時指定的外鍵關係。我不斷收到錯誤:

An item with the same key has already been added.

我使用看起來像代碼:

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("[email protected]", "pass", "[email protected]"); 

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(); 

此代碼生成錯誤:

An item with the same key has already been added.

+1

MembershipUser是由(相同的)DataContext跟蹤的嗎? – 2010-08-29 10:06:26

+2

是的membershipUser記錄是由與用於提交新用戶記錄相同的實體模型實例檢索的。 – BrooklynDev 2010-08-29 11:25:44

回答

8

好的我想出了這一個。像往常一樣,只是我犯了一個錯誤,並沒有立即趕上它,因爲我在錯誤的地方看。

該問題是由於我的表繼承和數據庫級別的配置。我將子表的(UserAdmin)外鍵字段定義爲一個標識,然後在我的模型中顯示爲StoreGeneratedPattern = Identity。當EF試圖將父項的主鍵傳播到其子項的外鍵字段時,這導致'具有相同鍵的項目已被添加錯誤'。

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

問題解決。

2

是這正是這個問題。你是如何獲得MembershipUser實體的?如果您沒有從當前的ObjectContext中獲取它,EF認爲它是新的,並嘗試將其插入到aspnet_users表。

嘗試將用戶添加到對象集後,使用此代碼:

// db is ObjectContext instance 
db.ObjectStateManager.ChangeObjectState(membershipUser, EntityState.Unchanged); 

Therea可能是一些其他的方式如何實現相同的結果,但是這對我的作品。

+1

我嘗試使用ChangeObjectState()但無濟於事,仍然得到'具有相同密鑰的項目已被添加'錯誤。我在原始文章中添加了我的測試代碼。 – BrooklynDev 2010-08-29 19:34:03

+0

我檢查了你的代碼,它應該可以工作。此外,當您通過EF選擇aspnet用戶時,您不需要設置其狀態 - 它已處於未更改狀態。 Users表是空的嗎? Users表中的UserId是否自動生成?如果您使用SQL Server並且安裝了SQL Profiler,則可以檢查執行了哪些SQL命令。 – 2010-08-29 20:08:32

+0

我已經在數據庫上運行配置文件,並且在成員資格提供程序完成Membership.CreateUser()之後,我似乎沒有看到任何插入語句。調用SaveChanges()似乎根本不會對數據庫執行任何插入或更新語句。 – BrooklynDev 2010-08-29 21:55:30

相關問題