Как использовать базу данных по умолчанию для столбца CreatedDate в EF code-first 4.3?

Я хотел бы иметь столбец CreatedDate в моей таблице Accounts, определенный следующим образом:

CreatedDate DATETIME NOT NULL DEFAULT GETUTCDATE()

Это будет отображаться на свойство CreatedDate в классе:

public class Account
{
    public DateTime? CreatedDate { get; private set; }
    // ... other properties ...
}

При создании новой учетной записи я хотел бы оставить CreatedDate равным NULL и позволить базе данных заполнить ее. При загрузке существующей учетной записи из БД я хотел бы, чтобы EF извлекал CreatedDate, сгенерированный базой данных.

Я использую код EF 4.3 с явными миграциями. Когда EF сгенерировал миграцию для таблицы Accounts, я изменил ее следующим образом:

CreatedDate = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"),

К сожалению, когда я пытаюсь сопоставить таблицу с помощью EF 4.3, EF пытается вставить значение NULL в столбец CreatedDate.

Я попытался установить DatabaseGeneratedOption.Identity для свойства, , как было предложено Ладиславом Мрнкой. Однако это удаляет параметр идентификации из свойства первичного ключа. Вместо этого я попытался использовать DatabaseGeneratedOption.Computed, но он продолжает пытаться вставить NULL. Я отменил все миграции и перезапустил их - проблема все еще возникает.

Вот что я делаю в OnModelCreating:

modelBuilder.Entity<Account>().Property(a => a.CreatedDate)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

У кого-нибудь есть предложения?

Спасибо за помощь,
Ричард


person Richard Beier    schedule 23.05.2012    source источник


Ответы (1)


Сделайте вашу дату недействительной в вашей сущности или нулевой в вашей базе данных. Значение по умолчанию базы данных используется только в том случае, если оператор вставки не отправляет явное значение. В случае EF это происходит только в том случае, если вы отмечаете свой CreatedDate с помощью DatabaseGeneratedOption.Identity. Если он удаляет идентификацию по умолчанию из вашего первичного ключа, принудительно используйте его вручную с помощью аннотаций данных или свободного API.

person Ladislav Mrnka    schedule 23.05.2012
comment
Спасибо Ладислав! Оно работает. Я отметил столбец CreatedDate и свой идентификатор с помощью DatabaseGeneratedOption.Identity. Я оставил его как обнуляемый в моем объекте и не обнуляемый в БД, но с опцией Identity он больше не вставляет явный NULL. - person Richard Beier; 23.05.2012