EF 4.1, сначала код: шаблон, созданный хранилищем ‘Вычисляемый’, не поддерживается для свойств, отличных от типа ‘timestamp’ или ‘rowversion’

#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 /…