实体框架4代码 - 首先是多对多插入 [英] Entity Framework 4 Code-First many to many insert

查看:94
本文介绍了实体框架4代码 - 首先是多对多插入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我有两个POCO类:

  public class Order 
{
[Key]
public int OrderId {get;组; }
public virtual ICollection< Item>物品{get;组; }
//其他字段
}

  public class Item 
{
[Key]
public int ItemId {get;组; }
public virtual ICollection< Order>订单{get;组; }
//其他字段
}

然后我有数据上下文类:

  public class DataContext:DbContext 
{
public DbSet< Item>物品{get;组; }
public DbSet< Order>订单{get;组; }
}

我有一个仓库类:

  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-d很多这个错误和EF多对多保存,但我没有找到任何有用的,这将有助于我,因为我找不到代码优先原则的示例。



谢谢!

解决方案

你可能有其他实体/ code> c code code code code code code这将导致您看到的错误。



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


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!

解决方案

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

这篇关于实体框架4代码 - 首先是多对多插入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆