Entity Framework 4 Code-First 多对多插入

发布于 2024-09-16 20:06:13 字数 1132 浏览 4 评论 0原文

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

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

谢谢!

I'm using code-first pattern for database layer.

I have two POCO classes:

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
}

Then I have data context class:

public class DataContext : DbContext
{
    public DbSet<Item> Items { get; set; }
    public DbSet<Order> Orders { get; set; }
}

And I have an "repository" class:

public class OrderRepository
{
    private DataContext dataContext = new DataContext();
    public void Save(Order entity)
    {
        entity.OrderDate = System.DateTime.Now;
        dataContext.Orders.Add(entity);
        dataContext.SaveChanges();
    }
}

When I call this OrderRepository.Save method I get an error: An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

In database I have a table Items, Orders and Items_Orders...I google-d a lot for this error and for EF many-to-many save, but I haven't find anything useful which would help me, because I couldn't find a sample for Code-First principle.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

天冷不及心凉 2024-09-23 20:06:13

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

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

You probably have other entities (from other repositories?) which came from other DataContexts related to your Order entity. That would cause the error you're seeing.

All repositories should share the same DataContext during a unit of work. You typically do this with constructor injection, like this:

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;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文