2

我在数据库层使用代码优先模式。

我有两个 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 和 Items_Orders ...我为这个错误和 EF 多对多保存进行了很多搜索,但我没有找到任何有用的东西来帮助我,因为我不能t 找到代码优先原则的示例。

谢谢!

4

1 回答 1

5

您可能有其他实体(来自其他存储库?)来自与您的实体DataContext相关的其他 s 。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;
    }
}
于 2010-09-01T12:39:45.080 回答