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 DataContext
s 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;
}
}
精彩评论