实体框架4 Code-First多对多插入

zig*_*mir 2 c# many-to-many entity-framework code-first entity-framework-4

我正在为数据库层使用代码优先模式.

我有两个POCO课程:

public class Order
{
    [Key]
    public int OrderId { get; set; }
    public virtual ICollection<Item> Items { get; set; }
    // other fields
}
Run Code Online (Sandbox Code Playgroud)

public class Item
{
    [Key]
    public int ItemId { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
    // other fields
}
Run Code Online (Sandbox Code Playgroud)

然后我有数据上下文类:

public class DataContext : DbContext
{
    public DbSet<Item> Items { get; set; }
    public DbSet<Order> Orders { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个"存储库"类:

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

当我调用此OrderRepository.Save方法时,我收到一个错误:IEntityChangeTracker的多个实例无法引用实体对象.

在数据库中我有一个表项,订单和Items_Orders ...我谷歌-d很多这个错误和EF多对多保存,但我没有找到任何有用的,这将有助于我,因为我无法'找到Code-First原则的样本.

谢谢!

Cra*_*ntz 5

您可能有其他实体(来自其他存储库?)来自DataContext与您的Order实体相关的其他实体.那会导致你看到的错误.

所有存储库应该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;
    }
}
Run Code Online (Sandbox Code Playgroud)