c# - Entity Framework 4 Code-First 多对多插入

标签 c# entity-framework entity-framework-4 many-to-many code-first

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

我有两个 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...我在 google 上搜索了很多关于此错误和 EF 多对多保存的信息,但我没有找到任何有用的内容来帮助我,因为我找不到代码优先原则的示例。

谢谢!

最佳答案

您可能还有其他实体(来自其他存储库?),这些实体来自与您的 Order 实体相关的其他 DataContext。这会导致您看到的错误。

所有存储库应在工作单元期间共享相同的DataContext。您通常通过构造函数注入(inject)来执行此操作,如下所示:

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;
    }
}

关于c# - Entity Framework 4 Code-First 多对多插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3617910/

相关文章:

c# - 具有业务层和 DAL 的 WPF 体系结构

linq - 复杂的 LINQ 或 EF 查询

c# - 使用带有泛型的基类创建类型的实例

c# - 带有 TPH 和枚举的 Entity Framework 中的多个 CASE WHEN

c# - 在 Linq to SQL 中处理 DataContext 后无法访问相关数据

c# - EF4 POCO,我如何过滤ByXX?

c# - 查看EF4生成的查询?

c# - 如何释放 C++ WinRT 值结构的内存

c# - 将月份字符串转换为 int 格式

c# - 何时使用 Observable.FromEventPattern 而不是 Observable.FromEvent?