2010-11-17 84 views
2

我正在爲一個小型項目使用實體框架v4。通常我使用NHibernate。我的問題是我無意中添加了一個代碼,該代碼添加了一個已經保存到數據庫上下文集合的對象,並且當我執行SaveChanges()時,EF製作了該對象的副本,併爲其提供了一個新的主鍵。實體框架添加現有項目導致克隆

雖然這很有用,但它不是我想要的。有沒有辦法關閉該功能,而是拋出異常?

UPDATE:CODE現在包括

public class CcUser 
{ 
    public int Id { get; set; } 
    [StringLength(50)] 
    public string TrackingId { get; set; } 
    [StringLength(50)] 
    public string MembershipGuid { get; set; } 

    public bool CookiesConfirmed { get; set; } 
    [StringLength(200)] 
    public string Email { get; set; } 

    public DateTime Modified { get; set; } 

} 

public class MyDbContext : DbContext 
{ 
    public DbSet<CcUser> Users { get; set; } 

} 

MyDbContext db = new MyDbContext(); 

var ccUser = db.Users.FirstOrDefault(u => u.TrackingId == id); 
ccUser.Modified = DateTime.UtcNow; 
db.Users.Add(ccUser); 
db.SaveChanges(); 
+0

你可以顯示代碼引起的問題? – 2010-11-18 00:16:04

+0

添加代碼,謝謝。 – 2010-11-18 17:09:13

回答

1

你怎麼知道這是同一個對象?

例如,如果是因爲它具有相同的名稱,那麼您可以在名稱字段中添加唯一索引。這樣添加一個重複的行會引發異常。

+0

它有相同的主鍵。我用FirstOrDefault檢索它,修改了一個非關鍵屬性,並添加到列表中,並保存。結果是另一個對象,而不是一個例外。 – 2010-11-18 01:17:37

1

你是否嘗試過沒有添加ccuser的行(例如倒數第二行)。如果對象已經連接到上下文,則savechanges()應該保持更改。如果這不起作用,請嘗試在savechanges()之前調用detectchanges()。

+0

我知道,但是如果我不小心添加了一個現有對象,我想EF會拋出一個PK衝突異常,而不會覆蓋我的PK和克隆! – 2010-11-18 19:41:30

+1

是您的主要標識列嗎?如果是這樣,那麼我認爲ef code-first會將其標記爲存儲區生成,並且任何添加實體的嘗試都將忽略之前設置的任何值。我認爲你要麼必須首先檢查一個實體是否與該主鍵一起存在,並更新相關的實體或嘗試將一個分離的實體附加到上下文中。添加做它的名字暗示 – 2010-11-18 22:09:18

0

大家誰遇到這個問題:

方法.Add標記entityEntityState.Added。並且,當您在上下文項EF中添加存在時,會因爲延遲加載而將其視爲新對象。

然後context.SaveChanges()將爲添加的項目生成新的主鍵並將其保存到DB。如果您不需要該功能,請使用AddOrUpdate

這裏相關的問題MSDN