2016-01-28 3 views
4

У меня есть следующий метод:Получение или прикрепление объект

public bool RemoveBookCategories(IDictionary<Books, IList<C_Category>> books) 
    { 
     _context.Configuration.AutoDetectChangesEnabled = true; 

     foreach (var book in books.Keys) 
     { 
      foreach (var category in books[book]) 
      { 
       if (!_context.ChangeTracker.Entries<Books>().Any(e => e.Entity.BookId == book.BookId)) 
        _context.Books.Attach(book); 
       if (!_context.ChangeTracker.Entries<C_Category>().Any(e => e.Entity.Id == category.Id)) 
        _context.C_Category.Attach(category); 

       book.C_Category.Remove(category); 
      } 
     } 

     if (_context.SaveChanges() > 0) 
      return true; 

     return false; 
    } 

Он работает, как и ожидалось .. Иногда. Иногда я получаю сообщение об ошибке:.

{ "Прикрепление объекта типа„DataAccess.Plusbog.C_Category“не удался, так как другой объект того же типа, уже имеет то же значение первичного ключа Это может произойти при использовании метод «Прикрепить» или задание состояния объекта «Без изменений» или «Модифицировано», если любые объекты на графике имеют конфликтующие значения ключей. Это может быть связано с тем, что некоторые объекты являются новыми и еще не получили значения ключей базы данных. В этом случае используйте метод «Добавить» или «Добавленное» состояние объекта для отслеживания графика, а затем установите состояние «не измененных» объектов на «Без изменений» или «Модифицировано», если это необходимо. »}

Это даже несмотря на то, что я чувствую, что это в значительной степени то, что я пытаюсь избежать поиска сущности в changetracker. Я чувствую, что я перепробовал все решения я мог бы найти, но ничего не работает: -/

Любая помощь будет оценена :-)

+0

Возможно, вы посмотрели мой ответ на [ASP.NET MVC - Прикрепление объекта типа «MODELNAME» не удалось, поскольку другой объект того же типа уже имеет такое же значение первичного ключа] (http://stackoverflow.com/вопросы/23201907/жерех-сетчатой ​​MVC-прикрепление-ан-субъект-оф-типа-ModelName-неудавшегося потому-другой-лор/39557606 # 39557606). –

ответ

0

Я решил это, присоединив мои модели к недавно созданному контексту, а затем сохранил изменения в этом. Это указывает на то, что я извлекаю данные о книгах и категориях с использованием разных контекстов, а затем пытаюсь сохранить изменения в другом контексте.

0

внимательно изучить навигационные свойства сущностей вы креплени: категории может имеют собственность Книги, у которой есть другие книги, которые, в свою очередь, имеют другие категории. EF будет перемещаться по всему графику и присоединяться к каждому объекту, к которому он может обратиться, создавая вышеупомянутую проблему. Попробуйте закрыть некоторые свойства навигации, которые вам не нужны.

Бьюсь об заклад, вы имеете это исключение, сохраняя список книг, имеющих одну или несколько категорий.

+0

Абсолютно. У книг есть общие категории. Я просто не знаю, как сохранить категории тогда, потому что мне придется прикрепить их, если они еще не прикреплены, иначе они вообще не будут сохранены. –

+0

Я думаю, что 'book.Categories = null' и' category.Books = null' перед прикреплением должен помочь. –

+0

К сожалению, нет кубиков. Получение такой же ошибки при попытке подключения. –

Смежные вопросы