我在数据库层使用代码优先模式。
我有两个 POCO 课程:
public class Order
{
[Key]
public int OrderId { get; set; }
public virtual ICollection<Item> Items { get; set; }
// other fields
}
and
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...我在 google 上搜索了很多这个错误和 EF 多对多保存,但我没有找到任何有用的东西可以帮助我,因为我不能'找到代码优先原则的示例。
Thanks!
您可能有其他实体(来自其他存储库?),它们来自其他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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)