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