#c# #entity-framework-4.1 #code-first
#c# #entity-framework-4.1 #сначала код
Вопрос:
все.
Я пытаюсь добавить оптимистичный параллелизм в мои сущности. В классе entity определено свойство:
public byte[] ObjectVersion
{
// ...
}
Вот конфигурация этого свойства:
Property(obj => obj.ObjectVersion)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)
.HasColumnName("ObjectVersion")
.IsConcurrencyToken();
Во время выполнения выдается исключение: «Сгенерированный в хранилище шаблон ‘Computed’ не поддерживается для свойств, которые не имеют типа ‘timestamp’ или ‘rowversion'». Соответствующий столбец базы данных имеет тип ‘rowversion’.
Хорошо, давайте изменим код конфигурации:
Property(obj => obj.ObjectVersion)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)
.HasColumnName("ObjectVersion")
.HasColumnType("rowversion")
.IsConcurrencyToken();
Но исключение все равно генерируется.
Что я делаю не так?
Комментарии:
1. это может прояснить проблему: social.msdn.microsoft.com/Forums/en-IE/adodotnetentityframework /…
2. Я прочитал этот раздел. Он описывает немного другую ситуацию: 1) любое пользовательское свойство, которое не настроено как токен параллелизма; 2) Alan_chen написал, что проблема в ObjectContext. CreateDatabase, я его не использую.
3. @BrokenGlass: Спасибо, вы совершенно правы! Я был невнимателен при просмотре трассировки стека. Причина исключения заключалась в инициализаторе базы данных по умолчанию: я ввел неправильное имя базы данных, и он попытался создать базу данных, поэтому у меня возникла ситуация из темы Ладислава из MSDN. Но это очень , очень глупо в случае стратегии по умолчанию — создавать базу данных! Представьте, что администратор подключается к серверу базы данных, думая, что он подключается к существующей базе данных. Инициализатор по умолчанию создает базу данных, а затем все подключенные пользователи просматривают пустые таблицы данных … сбой
Ответ №1:
В документации показаны эти два метода настройки токена параллелизма:
modelBuilder.Entity<OfficeAssignment>()
.Property(t => t.Timestamp)
.IsConcurrencyToken();
modelBuilder.Entity<OfficeAssignment>()
.Property(t => t.Timestamp)
.IsRowVersion();
Комментарии:
1. Вы имели в виду, что я должен удалить вызов «.HasDatabaseGeneratedOption()»? Достаточно ли параметра «IsConcurrencyToken», чтобы DbContext автоматически обновлял значение из хранилища?
2. @Dennis, я не могу сказать наверняка о
IsConcurrencyToken
, ноIsRowVersion
он должен обновляться автоматически.3. внимательный взгляд на IsConcurrencyToken и HasDatabaseGeneratedOption показал, что они должны быть объединены для нормальной работы. И откуда взят метод «IsRowVersion»? Класс PrimitivePropertyConfiguration его не содержит.
4. @Dennis, это метод на
BinaryPropertyConfiguration
: msdn.microsoft.com/en-us/library /…