Question

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!

Was it helpful?

Solution

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;
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top