Entity Framework 4, объекты POCO и ASP.Net MVC2. У меня есть много разных отношений, скажем между BlogPost и тегами. Это означает, что в моем T4 сгенерированном классе 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 из контекста, а затем изменение коллекции не работает. (с помощью разных методов из следующей точки)
- Это, вероятно, сработает, но я надеюсь, что это всего лишь обходное решение, а не решение: (.
- Функция Tried Attach/Add/ChangeObjectState для BlogPost и/или тегов во всех возможных комбинациях. Не удалось.
- Это похоже на то, что мне нужно, но оно не работает (я пытался исправить это, но не могу для своей проблемы).
- Попробовал ChangeState/Add/Attach/... объекты отношений контекста. Не удалось.
"Не работает" означает, что в большинстве случаев я работал над данным "решением", пока не произведет никаких ошибок и сохранит хотя бы свойства BlogPost. Что происходит с отношениями: обычно теги снова добавляются в таблицу тегов с новыми PK, а сохраненный BlogPost ссылается на те, а не на оригинальные. Конечно, у возвращаемых тегов есть PK, а до методов сохранения/обновления я проверяю PK, и они равны тем, которые есть в базе данных, поэтому, вероятно, EF считает, что они являются новыми объектами, а те PK являются временными.
Проблема, о которой я знаю, и может сделать невозможным автоматическое простое решение: когда коллекция объектов POCO изменяется, это должно произойти с помощью вышеупомянутого свойства виртуальной коллекции, потому что тогда трюк FixupCollection обновит обратные ссылки на другой конец отношений "многие ко многим". Однако, когда View "возвращает" обновленный объект BlogPost, этого не произошло. Это означает, что, возможно, нет простого решения моей проблемы, но это меня очень огорчило бы, и я бы ненавидел EF4-POCO-MVC триумф:( Также это означало бы, что EF не может сделать это в среде MVC в зависимости от того, что Типы объектов EF4 используются:( Я думаю, что отслеживание изменений на основе моментальных снимков должно обнаружить, что измененный BlogPost имеет отношения с тегами с существующими ПК.
Btw: Я думаю, что одна и та же проблема возникает с отношениями "один ко многим" (Google и мой коллега так говорят). Я дам ему попробовать дома, но даже если это работает, это не поможет мне в моих шести отношениях "многие ко многим" в моем приложении: (.