2015-09-04 67 views
3

當我使用AutoMapper錯誤,這個錯誤發生:「相同類型的實體已經有相同的主鍵值」使用AutoMapper

附加型「MyProject.DAL.User」的實體失敗,因爲另一個相同類型的實體已具有相同的主鍵值。如果圖中的任何實體具有衝突的鍵值,則使用「附加」方法或將實體的狀態設置爲「未更改」或「已修改」時可能會發生這種情況。這可能是因爲一些實體是新的並且還沒有收到數據庫生成的關鍵值。在這種情況下,使用'Add'方法或'Added'實體狀態來跟蹤圖形,然後根據情況將非新實體的狀態設置爲'Unchanged'或'Modified'。

我想將User從UserModel映射到數據庫中。我在用戶界面中更改UserModel屬性,然後再次將其映射到用戶並更新它。 我的代碼是在這裏:

public UserModel GetUserByUserId(int id) 
    { 
     var user = db.Users.Where(p => p.UserId == id).FirstOrDefault(); 
     var userModel = Mapper.Map<UserModel>(user); 
     return userModel; 
    } 

public void Update(UserModel userModel) 
    { 
     var user = Mapper.Map<User>(userModel); 
     db.Entry(user).State = EntityState.Modified; 
     db.SaveChanges(); 
    } 

,但如果我不使用自動映射器和寫類似下面的代碼,它正常工作。

public void Update(UserModel userModel) 
    { 
     updatingUser.Email = userModel.Email; 
     updatingUser.FirstName = userModel.FirstName; 
     updatingUser.ModifiedDate = DateTime.Now; 
     updatingUser.LastName = userModel.LastName; 
     updatingUser.Password = userModel.Password; 
     updatingUser.UserName = userModel.UserName; 

     db.Entry(updatingUser).State = EntityState.Modified; 
     db.SaveChanges(); 
    } 

我應該怎麼做:

+4

'updatesUser'似乎在你的第二個更新函數中無處可來 –

+0

請看看我對ASP.NET MVC的回答 - 附加一個'MODELNAME'類型的實體失敗,因爲另一個同類型的實體已經有相同的主鍵值](http://stackoverflow.com/questions/23201907/asp-net-mvc-attaching-an-entity-of-type-modelname-failed-because-another-ent/39557606#39557606)。 –

回答

15

這可能只是我意識不到的一些功能,但你update功能看起來時髦給我。我不明白它是如何將您的新user與db中現有的user相關聯。

這就是我如何接近它。

public void Update(UserModel userModel) 
{ 
    var user = db.Users.Find(userModel.UserId); 
    Mapper.Map(userModel, user); 
    db.SaveChanges(); 
} 

,或者,如果你喜歡做它喜歡你的第二個update功能確實

public void Update(UserModel userModel) 
{ 
    Mapper.Map(userModel, updatingUser); 
    db.Entry(updatingUser).State = EntityState.Modified; 
    db.SaveChanges(); 
} 
+3

正是。 EF需要有一個從數據庫中查詢的實體進行更新 - 而不是新構建的實體。 – overslacked

+0

謝謝。我先用它,它工作正常。 – alite

+0

@ sam-i-am很好地解釋過,但如果UserModel有一個DTO集合,這個映射函數會嘗試將該集合添加到我們從數據庫中檢索到的對象(用戶在第一個示例中),這是不正確的。有沒有辦法解決這個問題? –

-4

對象A和他的子對象B,然後設置所有屬性,然後刷新它朝。 我們不再:附上(以前的對象A和B) 我們不再單獨提取對象B.

+0

這沒有任何意義,它看起來像是一堆隨機的生成的單詞... –

相關問題