Entity Framework 4, об'єкти POCO та ASP.Net MVC2. Я маю багато-багато стосунків, скажімо між суб'єктами BlogPost та Tag. Це означає, що в моєму генерованому Т4 класі POCO BlogPost у мене є:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Я прошу BlogPost та пов'язані з ними теги з екземпляра ObjectContext і надсилаю його на інший шар (Перегляд у програмі MVC). Пізніше я повертаю оновлений BlogPost із зміненими властивостями та зміненими відносинами. Наприклад, у ньому були теги "A", "B" і "C", а нові теги - "C" і "D". У моєму конкретному прикладі немає нових тегів, і властивості тегів ніколи не змінюються, тому єдине, що слід зберегти, - це змінені відносини. Тепер мені потрібно зберегти це в іншому ObjectContext. (Оновлення. Тепер я намагався зробити це в тому ж екземплярі контексту, а також не вдалося.)
Проблема: я не можу змусити її зберегти відносини належним чином. Я спробував усе, що знайшов:
- Controller.UpdateModel та Controller.TryUpdateModel не працюють.
- Отримати старий BlogPost з контексту та змінити колекцію не вийде. (різними методами з наступного пункту)
- Це, мабуть, спрацювало б, але я сподіваюся, що це лише рішення, а не рішення :(.
- Перевірені функції додавання / додавання / зміниObjectState для BlogPost та / або тегів у всіх можливих комбінаціях. Не вдалося.
- Це виглядає як те, що мені потрібно, але це не працює (я намагався виправити це, але не можу для своєї проблеми).
- Спробував ChangeState / Add / Attach / ... об'єкти зв’язку контексту. Не вдалося.
"Не працює" означає, що в більшості випадків я працював над даним "рішенням", поки воно не створює помилок і зберігає принаймні властивості BlogPost. Те, що відбувається із відносинами, змінюється: теги зазвичай додаються знову до таблиці тегів з новими ПК, а збережені BlogPost посилаються на ті, а не на оригінальні. Звичайно, повернуті Теги мають ПК, і перед методами збереження / оновлення я перевіряю ПК, і вони рівні рівним тим, які знаходяться в базі даних, тому, ймовірно, EF вважає, що це нові об'єкти, а ці ПК - тимчасові.
Проблему, про яку я знаю, і яка може унеможливити пошук автоматизованого простого рішення: Коли колекція об'єкта POCO буде змінена, це повинно відбутися вищезгаданим властивістю віртуальної колекції, оскільки тоді фокус FixupCollection оновить зворотні посилання на іншому кінці відносин "багато хто до багатьох" Однак коли View "повертає" оновлений об’єкт BlogPost, цього не сталося. Це означає, що, можливо, немає простого рішення моєї проблеми, але це дуже засмутить мене, і я ненавиджу тріумф EF4-POCO-MVC :(. Також це означатиме, що EF не може цього зробити в середовищі MVC залежно від того Використовуються типи об’єктів EF4 :(. Я думаю, що відстеження змін на основі знімків повинно з’ясувати, що змінений BlogPost має зв'язок із тегами з існуючими ПК.
Btw: Я думаю, що однакова проблема трапляється і з стосунками один на багато (так говорять google і мій колега). Я спробую вдома, але навіть якщо це працює, це не допомагає мені в моїх шести багато-багато-багато стосунків у моєму додатку :(.