Ответ 1
Вы не можете использовать частные модификаторы, потому что сам EF должен устанавливать ваши свойства при загрузке вашего объекта, а Code First может делать это только тогда, когда свойство имеет общедоступный сеттер (в отличие от EDMX, где возможны частные настройки (1), (2)).
Что вам нужно сделать, это отметить свой CreatedDate
с помощью DatabaseGeneratedOption.Identity
и AmendDate
с помощью DatabaseGeneratedOption.Computed
. Это позволит EF правильно загружать данные из базы данных, перезагружать данные после вставки или обновления, чтобы объект был обновлен в вашем приложении и в то же время он не позволит вам изменить значение в приложении, поскольку значение, установленное в приложение никогда не будет передано в базу данных. С объектно-ориентированной точки зрения это не очень хорошее решение, но с точки зрения функциональности это именно то, что вы хотите.
Вы можете сделать это либо с аннотациями данных:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreatedDate { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime AmendDate { get; set; }
Или с текущим API в OnModelCreating
переопределить в производном контексте:
modelBuilder.Entity<YourEntity>()
.Property(e => e.CreatedDate)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<YourEntity>()
.Property(e => e.AmendDate)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);