Обновляйте отношения при сохранении изменений EF4 POCO объектов

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. (Обновление: Теперь я попытался сделать это в том же самом экземпляре контекста, но не смог.)

Проблема: Я не могу заставить его сохранить отношения должным образом. Я перепробовал все, что нашел:

  • Controller.UpdateModel и Controller.TryUpdateModel не работают.
  • Получение старого BlogPostа из контекста, а затем модификация коллекции не работает. (с различными методами из следующего пункта)
  • Это, вероятно, сработало бы, но я надеюсь, что это просто обходной путь, а не решение :(.
  • Tried Attach/Add/ChangeObjectState функций для BlogPost и/или Tags во всех возможных комбинациях. Не получилось.
  • This выглядит так, как мне нужно, но это не работает (я пытался это исправить, но не смог для своей проблемы).
  • Попробовал ChangeState/Add/Attach/... объекты связи контекста. Не получилось.

"Не работает" в большинстве случаев означает, что я работал над данным "решением" до тех пор, пока оно не выдает ошибок и сохраняет, по крайней мере, свойства 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 и мой коллега так говорят). Я попробую это дома, но даже если это сработает, это не поможет мне в моих шести много-многочисленных отношениях в моем приложении :(.

107
задан Community 23 May 2017 в 11:53
поделиться