Нужно ли добавлять свойство типа RowVersion TimeStamp «Entity Framework Code First» в родительский и дочерний классы? - PullRequest
3 голосов
/ 13 февраля 2012

Мой вопрос здесь заключается в том, должен ли я размещать свойство RowVersion [TimeStamp] в каждом сущность в моей доменной модели. Например: у меня есть класс Order и свойство OrderDetails "navigation, reference", я должен использовать свойство RowVersion для обеих сущностей, или этого достаточно для родительского объекта?

Эти классы представляют собой pocos, предназначенные для использования с подходом Entity Framework Code First.

Спасибо.

1 Ответ

4 голосов
/ 15 февраля 2012

Ответ, как часто бывает, «это зависит».

Поскольку почти всегда можно иметь Order без каких-либо OrderDetail s, вы правы, что родительский объект должениметь свойство RowVersion.

Можно ли изменить OrderDetail без , также изменяя Order?Должно ли это быть?

Если это невозможно и не должно быть, свойство RowVersion на уровне детализации ничего не добавляет.Вы уже поймали все возможные модификации, проверив Order 'RowVersion.В этом случае добавьте только свойство на верхнем уровне и прекратите чтение здесь.

В противном случае, если два независимых контекста загружают один и тот же порядок и детали, оба изменяют другой OrderDetail, и оба пытаются сохранитьВы хотите рассматривать это как конфликт?В некоторых случаях это имеет смысл.В других случаях это не так.Чтобы рассматривать его как конфликт, самое простое решение - пометить Order как измененный, если он не изменился (используя ObjectStateEntry.SetModified, а не ObjectStateEntry.ChangeState).EF проверит и вызовет обновление свойства Order RowVersion, и сообщит, если кто-либо еще внес какие-либо изменения.

Если вы хотите разрешить двум независимым контекстам изменять два разных OrderDetailс одинаковыми Order, да, вам нужен атрибут RowVersion на уровне детализации.

При этом: если вы загружаете Order и OrderDetail s в один и тот же контекст, изменитеOrderDetail и сохраните ваши изменения, Entity Framework также может проверять и обновлять Order RowVersion, даже если вы на самом деле не изменили Order, вызывая ложные исключения параллелизма,Это было помечено как ошибка, и исправление доступно, или вы можете установить .NET Framework 4.5 (в настоящее время доступен в форме кандидата на выпуск), который исправляет это, даже если ваше приложение использует .NET 4.0.

...