我正在为数据库层使用代码优先模式。
我有两个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 ...我谷歌-d很多这个错误和EF多对多保存,但我没有找到任何有用的,这将有助于我,因为我找不到代码优先原则的样本。
谢谢!
答案 0 :(得分: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;
}
}