Передать ссылку на значение из главной сущности в собственные сущности в EF Core
Имеется класс Court у которого есть вложенные классы / собственные сущности CourtName и Address1. Есть перечисление RussianRegionEnum, которое хранится в "главной" сущности. Я хотел бы передать значение этого класса по ссылке в собственные сущности CourtName и Address1, как это сделать?
public class Court
{
public int Id { get; set; }
//...
public RussianRegionEnum RussianRegion { get; set; }
public CourtName Name { get; set; }
public Address Address1 { get; set; }
}
[Owned]
public class CourtName
{
//...
public RussianRegionEnum RussianRegion { get; set; }
}
[Owned]
public class Address
{
public RussianRegionEnum RussianRegion { get; set; }
}
Пробовал передать значение через конструктор класса Court но к моменту запуска конструктора этого класса, вложенные объекты Name и Address1 еще не инициализированы. Насколько я понимаю проблему можно как-то решить через внешние ключи, но я не нашел решения для собственных сущностей, которые внешних ключей не имеют.
Ответы (1 шт):
Как оказалось, моя проблема решается с помощью вычисляемых значений (computed values). Это столбцы, значение которых вычисляется на уровне базы данных исходя из констант и данных взятых из иных столбцов. В данном случае столбец Name_RussianRegion необходимо сделать вычисляемым и заставить его возвращать значение колонки RussianRegion т.е. свойство типа-владельца. Сделать это проще всего добавив запись в OnConfiguring обработчик событий следующим образом:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Court>(court =>
{
court.OwnsOne(a => a.Name, reg =>
{
reg.Property(b => b.RussianRegion).HasComputedColumnSql("RussianRegion", stored: true);
});
});
}
Метод HasComputedColumnSql в данном случае имеет 2 параметра: первый это SQL выражение в текстовом виде, которое в данном случае просто является названием колонки значение которой возвращается. Параметр stored: true означает, что вычисленное значение хранится в базе данных, а не вычисляется при каждом обращении к БД.