Entity Framework 4, POCO объекты и ASP.Net MVC2. У меня много или много связей, скажем, между BlogPost и Tag сущностями. Это означает, что в моем сгенерированном T4 классе POCO BlogPost у меня есть:
public virtual ICollection Tags {
// getter and setter with the magic FixupCollection
}
private ICollection _tags;
Я запрашиваю BlogPost и связанные с ним Tags из экземпляра ObjectContext и посылаю его на другой уровень (View в MVC-приложении). Позже я возвращаю обновлённый BlogPost с изменёнными свойствами и изменёнными отношениями. Например, в нем появились теги "A" "B" и "C", а новые теги - "C" и "D". В моем конкретном примере новых тегов нет и свойства Tags никогда не меняются, поэтому единственное, что должно быть сохранено - это измененные отношения. Теперь мне нужно сохранить это в другом ObjectContext. (Обновление: Теперь я попытался сделать это в том же самом экземпляре контекста, но не смог.)
Проблема: Я не могу заставить его сохранить отношения должным образом. Я перепробовал все, что нашел:
"Не работает" в большинстве случаев означает, что я работал над данным "решением" до тех пор, пока оно не выдает ошибок и сохраняет, по крайней мере, свойства BlogPost. То, что происходит с отношениями, меняется: обычно Tags снова добавляются в таблицу Tagов с новыми PK, а сохраненные ссылки BlogPost - с теми, а не с оригинальными. Конечно, возвращаемые Tags имеют PK, и перед методами сохранения/обновления я проверяю PK и они равны тем, что есть в базе данных, так что, вероятно, EF думает, что это новые объекты, а эти PK - временные.
Проблема, о которой я знаю, и которая может сделать невозможным поиск автоматизированного простого решения: Когда коллекция объектов POCO изменяется, это должно происходить с помощью упомянутого выше свойства виртуальной коллекции, потому что тогда трюк FixupCollection обновит обратные ссылки на другом конце много-много-к-многим отношениям. Однако, когда View "возвращает" обновлённый объект BlogPost, этого не произошло. Это значит, что, может быть, нет простого решения моей проблемы, но это бы меня очень огорчило, и я бы возненавидел триумф EF4-POCO-MVC :(. Также это означало бы, что EF не может сделать это в среде MVC, какие бы типы объектов EF4 не использовались :(. Я думаю, что отслеживание изменений на основе снимков должно выявить, что измененный BlogPost имеет отношения к Tags с существующими PK.
Btw: Я думаю, что та же проблема возникает и с отношениями "один-ко-многим" (google и мой коллега так говорят). Я попробую это дома, но даже если это сработает, это не поможет мне в моих шести много-многочисленных отношениях в моем приложении :(.