Подтвердить что ты не робот

Колонка EF Code First Readonly

Я использую EF Code сначала с использованием первого подхода к базе данных. "с Database.SetInitializer(null);"

В моей таблице есть два столбца createddate и modifyddate. Они управляются SQL Server с помощью триггеров. Идея заключается в том, что при вводе данных эти столбцы получают данные через триггеры.

Теперь я хочу сделать это только для чтения с первой точки зрения EF Code. То есть Я хочу, чтобы увидеть созданные даты и ameneded даты из моего приложения, но я не хочу, чтобы изменить эти данные.

Я попытался использовать частные модификаторы в setter, но не повезло. Когда я пытаюсь добавить новые данные в таблицу, он попытался ввести дату DateTime.Max в базу данных, которая выдает ошибку с SQL-сервера.

Любая идея?

4b9b3361

Ответ 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);