【问题标题】:Entity Framework 4 Code-First many to many insertEntity Framework 4 Code-First 多对多插入
【发布时间】:2011-04-06 18:49:09
【问题描述】:

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

我有两个 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 多对多保存做了很多谷歌搜索,但我没有找到任何有用的东西来帮助我,因为我找不到代码优先原则的示例。

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    在一个工作单元期间,所有存储库都应共享相同的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;
        }
    }
    

    【讨论】:

    • 感谢您的回答。如何为 DataContext 类创建构造函数注入?
    • 查看更新的答案。然后对 UOW 中的所有存储库使用单个 DataContext
    • 谢谢,就是这样! :) 你能给我推荐一本 Entity Framework 4 书籍/网站/博客,其中包含每个使用它的人都应该知道的基本知识吗?
    • 我问错人了。我从来没有读过任何EF的书。但 Mark Seeman 的 .NET 中的依赖注入 很好地涵盖了 EF 和 MVC 集成。
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多