Entity Framework 4 Code-First многие ко многим вставить - PullRequest
2 голосов
/ 01 сентября 2010

Я использую шаблон кода для слоя базы данных.

У меня есть два класса 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-d для этой ошибки и для EF многие-ко-многим, но я не нашел ничего полезного, что помогло бы мне, потому что Я не смог найти образец для принципа Code-First.

Спасибо!

1 Ответ

5 голосов
/ 01 сентября 2010

Возможно, у вас есть другие сущности (из других репозиториев?), Которые пришли из других DataContext s, связанных с вашей Order сущностью. Это может привести к ошибке, которую вы видите.

Все хранилища должны иметь одинаковые 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;
    }
}
...