2012-10-21 39 views
2

這是相當自我解釋。 我如何防止EF插入一個已經存在於db中的對象,當添加一個包含第一個對象的對象時?

public class Subject 
{ 
    public Classroom Class {get; set;} 
} 

我使用的是無狀態的立面包含其他 讓我們稱他們爲主題的一類和課堂,至極意味着我的DbContext正在復甦的對象後立即設置,並創建存儲新的。 不應該知道Classroom不是新對象,因爲它的ID已經在數據庫中了嗎? 使用調試器我可以在調用SaveChanges方法之前跟蹤到該點,並且Classroom.id是我在數據庫上的那個。 什麼問題? EF增加了一個新的Classroom,它具有上一個的確切屬性,但是新增了一個PK。 我在這裏做錯了什麼?

這是用於一般的CRUD操作的代碼(他們在我的DbContext)兩個更新和刪除工作就好了:

public void Update(DbSet MySet, object Obj) 
    { 
     MySet.Attach(Obj); 
     var Entry = this.Entry(Obj); 
     Entry.State = EntityState.Modified; 
     this.SaveChanges(); 
    } 


    public void Insert(DbSet MySet, object Obj) 
    { 
     MySet.Add(Obj); 
     this.SaveChanges(); 
    } 


    public void Delete(DbSet MySet, object Obj) 
    { 
     MySet.Attach(Obj); 
     var Entry = this.Entry(Obj); 
     Entry.State = EntityState.Deleted; 
     this.SaveChanges(); 
    } 

回答

5

沒有看到你實際的代碼你怎麼是要麼更新或者創建你的實體,很難說。但是,您可能未附加課堂,因此EF認爲該實體是新的,但實際上並非如此。

 using (Model m = new Model()) 
    { 
     m.Subject.Add(subject); 
     m.Classrooms.Attach(subject.Class); 
     m.SaveChanges();   
    } 

即使PK是一樣的,不附加到的背景下,英孚已經沒有搞清楚你在做什麼意圖的方式。附加實體明確告訴你的上下文你想要什麼。

+0

謝謝,這可能工作!我使用了類似的代碼,但我已經定義了一個通用方法來插入我的實體,並使用一個通用對象: public void Insert(DataSet dSet,object obj) dSet.Add(obj); this.SaveChanges(); } } 所以我想沒有辦法做到這種匿名狀態 – Alvaro

+0

它是添加外鍵,但強制插入...我只想保持外鍵 – RollRoll

+1

謝謝,這項工作。這很煩人。如果模型有一個Id,預計EF知道這不是一個新的。但再次感謝。 – jcmordan

相關問題