Начиная с обсуждения в комментариях, я перейду к подробному ответу:
Вы можете использовать EF Core недавно представленный Owned Entity функция типа где Address
- это Owned Entity
тип Something
и SomethingElse
, тогда как Something
и SomethingElse
являются владельцами следующим образом:
modelBuilder.Entity<SomeThing>().OwnsOne(st => st.Address);
modelBuilder.Entity<SomeThingElse>().OwnsOne(st => st.Address);
По соглашению EF Core будет называть столбцы базы данных длясвойства принадлежащего типа сущности по шаблону Navigation_OwnedEntityProperty .Поэтому свойства Address
появятся в таблице Something
и SomethingElse
с именами 'Address_Street' и 'Address_City'.
Теперь, если вы не хотите, чтобы имя столбца с собственным типом сущности было похоже Navigation_OwnedEntityProperty затем вы можете задать имя своего пользовательского столбца следующим образом:
modelBuilder.Entity<SomeThing>().OwnsOne(st => st.Address,
a =>
{
a.Property(p => p.Street).HasColumnName("Street");
a.Property(p => p.City).HasColumnName("City");
});
modelBuilder.Entity<SomeThingElse>().OwnsOne(ste => ste.Address,
a =>
{
a.Property(p => p.Street).HasColumnName("Street");
a.Property(p => p.City).HasColumnName("City");
});
Кроме того, собственные типы могут храниться в отдельной таблице от владельца.Чтобы переопределить соглашение, согласно которому принадлежащий тип сопоставляется с той же таблицей, что и владелец, вы можете просто вызвать ToTable
и указать другое имя таблицы следующим образом:
modelBuilder.Entity<SomeThing>().OwnsOne(st => st.Address,
a =>
{
a.ToTable("SomeThingAddress");
});
modelBuilder.Entity<SomeThingElse>().OwnsOne(ste => ste.Address,
a =>
{
a.ToTable("SomeThingElseAddress");
});
Запрос собственных типов
При запросе владельца по умолчанию будут включены принадлежащие ему типы.Нет необходимости использовать метод Include, даже если принадлежащие типы хранятся в отдельной таблице.
Ограничения
Некоторые из этих ограничений являются основополагающими для работы типов собственных сущностей, но некоторыедругие ограничения, которые мы сможем снять в будущих выпусках:
Ограничения на уровне конструкции:
- Вы не можете создать
DbSet<T>
для собственного типа - Вы не можете позвонить
Entity<T>()
с собственным типом на ModelBuilder
Для более подробной информации: Ограничения на типы, принадлежащие базовому объекту EF