У меня есть класс TypeEntity, который будет действовать как базовый класс для нескольких десятков объектов. Я использую TPC, поэтому мне нужно сопоставить все свойства базового класса с таблицей с именем конкретного класса и установить поле Key для создания базы данных.
В настоящее время я делаю это с EntityTypeConfiguration для каждого типа сущности, который выглядит следующим образом:
class LineItemType : EntityTypeConfiguration<Models.LineItemType>
{
public LineItemType()
{
this.Property(e => e.Key)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Map(e => e.MapInheritedProperties()
.ToTable(nameof(LineItemType)));
}
}
Это прекрасно работает, но очень повторяется. Я должен помнить о создании класса конфигурации для каждого типа, который наследует от TypeEntity, устанавливает ключ и сопоставляет унаследованные свойства. Это кажется идеальным вариантом для пользовательского Convention.
Я создал TypeEntityTpcConvention Convention следующим образом:
class TypeEntityTpcConvention : Convention
{
public TypeEntityTpcConvention()
{
this.Types<TypeEntity>()
.Configure(e => e.Property(p => p.Key)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity));
}
}
Что работает, чтобы установить Key как сгенерированную базу данных, но я не могу найти способ доступа к сопоставлениям таблиц для свойств изнутри соглашения.
В идеале я ожидал бы что-то вроде этого:
this.Types<TypeEntity>()
.Configure(e => e.MapInheritedProperties()
.ToTable(e.ClrType.Name));
Или даже такой вызов для каждого свойства, которое необходимо сопоставить:
this.Types<TypeEntity>()
.Configure(e => e.Property(p=>p.Key)
.ToTable(e.ClrType.Name));
Ни один из них не существует. Есть ли способ управлять отображением свойств изнутри a Convention?
После некоторых дополнительных исследований, похоже, что в качестве IStoreModelConvention и IConceptualModelConvention доступны более расширенные варианты условных соглашений, но полезной документации по их использованию не хватает. Через несколько часов, пробивая через них точки останова и окна просмотра, я не понял, как управлять сопоставлением столбцов с помощью этих интерфейсов.
Мое текущее решение - использовать отражение, чтобы найти все типы, наследующие от TypeEntity в OnModelCreating, и сопоставить свойства с правильной таблицей. Это работает, но я предпочел бы использовать соглашение, если это возможно, поскольку это действительно похоже на то, для чего были сделаны условные обозначения. Я чувствую, что мне не хватает чего-то очевидного.