开发者

Entity Framework 4 Code-First many to many insert

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 { g开发者_开发技巧et; 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;
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜