Я пытаюсь создать абстрактный класс, который будет содержать свойства, и каждый объект в моем решении будет наследовать эти свойства.
Я хочу, чтобы свойства абстрактного класса были ограничены от любых пользовательских модификаций, кроме изменений, сделанных кодом.
Чего я хочу достичь:
public abstract class SystemEntityBase
{
/// <summary>
/// Gets the date when entity was created.
/// </summary>
public DateTime Created { get; } = DateTime.UtcNow;
/// <summary>
/// Gets the date when entity was last active in the system.
/// </summary>
public DateTime LastActive { get; } = DateTime.UtcNow;
}
Поскольку я использую свойство только для чтения, EntityFrameworkCore не будет добавлять эти поля в мою таблицу базы данных при автоматическом создании сценариев миграции.
Мне любопытно, какие есть возможные решения для ограничения свойств в моем случае, а также для создания столбцов базы данных?
Вам также может понравиться такой подход.
Вы должны иметь возможность использовать свойства только для инициализации, если вы можете использовать С# 9.0.
Для свойств инициализации требуется c# 9 и либо .net 5, либо ручная копия необходимого типа mod-req. Определенно стоит попробовать - я просто говорю, что нужен не только С# 9.
Но пользователь по-прежнему сможет установить значение свойства с помощью new SomeEntity {Created = ....}
, чего, как я понимаю, не хочет OP.
Если я правильно понял проблему - вы можете попробовать использовать Backing Fields. Для вашего свойства Created
это может выглядеть примерно так (по какой-то причине использование BackingFieldAttribute
не сработало для меня с моими тестовыми настройками SQLite и postgres, но свободный API помог):
public class SomeEntity
{
public DateTime Created => _created
private DateTime _created = DateTime.UtcNow;
}
И в OnModelCreating(ModelBuilder modelBuilder)
:
modelBuilder.Entity<SomeEntity>()
.Property(b => b.Created)
.HasField("_test");
Также можно избавиться от необходимости настраивать все SomeEntity
вручную с помощью некоторой магии отражения.
[ReadOnly(true)]
помогает вообще?