2

我使用的數據庫層代碼優先模式。實體框架4代碼優先多對多插入

我有兩個POCO類:

public class Order 
{ 
    [Key] 
    public int OrderId { get; set; } 
    public virtual ICollection<Item> Items { get; set; } 
    // other fields 
} 

public class Item 
{ 
    [Key] 
    public int ItemId { get; set; } 
    public virtual ICollection<Order> Orders { get; set; } 
    // other fields 
} 

然後,我有數據上下文類:

public class DataContext : DbContext 
{ 
    public DbSet<Item> Items { get; set; } 
    public DbSet<Order> Orders { get; set; } 
} 

而且我有一個 「倉庫」 類:

public class OrderRepository 
{ 
    private DataContext dataContext = new DataContext(); 
    public void Save(Order entity) 
    { 
     entity.OrderDate = System.DateTime.Now; 
     dataContext.Orders.Add(entity); 
     dataContext.SaveChanges(); 
    } 
} 

當我把這個OrderRepository.Save方法,我得到一個錯誤:一個實體對象不能被IEntityChangeTracker的多個實例的引用。

在數據庫中我有一個表項目,訂單和Items_Orders ...我google-d很多這個錯誤和EF多對多保存,但我沒有找到任何有用的,這將幫助我,因爲我找不到Code-First原則的樣本。

謝謝!

回答

5

你可能有這些來自其他關係到你的Order實體DataContext S以外的實體(從其他倉庫?)。這會導致你看到的錯誤。

所有倉庫應在一個工作單元中共享相同的DataContext。您通常使用構造函數注入來執行此操作,如下所示:

public class OrderRepository 
{ 
    private readonly DataContext dataContext; 
    public void Save(Order entity) 
    { 
     entity.OrderDate = System.DateTime.Now; 
     dataContext.Orders.Add(entity); 
     dataContext.SaveChanges(); 
    } 

    public OrderRepository(DataContext dataContext) 
    { 
     this.dataContext = dataContext; 
    } 
} 
+0

感謝您的回答。我怎麼能創建一個DataContext類的構造函數注入? – zigomir 2010-09-01 13:00:45

+0

查看更新的答案。然後在UOW的所有存儲庫中使用一個'DataContext'。 – 2010-09-01 14:44:34

+0

謝謝,就是這樣! :)你能推薦我一個實體框架4電子書/網站/帶根本性的東西博客,大家誰使用它應該知道嗎? – zigomir 2010-09-02 06:20:49