У меня есть несколько типов, которые наследуют от интерфейса «IEventReportElement», который предоставляет свойство «IdEventReport»:иметь особую конфигурацию свойств для всех типов, которые реализуют интерфейс, за исключением одного
public interface IEventReportElement
{
long Id { get; set; }
long? IdEventReport { get; set; }
}
Это nullable, так как я не всегда могу правильно его правильно заполнить, но не должен иметь значение NULL в базе данных.
Вот почему я добавил линию
modelBuilder.Types<IEventReportElement>().Configure(x=>x.Property(y=>y.IdEventReport).IsRequired());
моему методу OnModelCreating в DbContext.
Однако Type 'Position' должен реализовать этот интерфейс, но не должен иметь столбец для свойства IdEventReport в базе данных, а вместо этого столбца для свойства IdParent, которое он предоставляет.
public class Position : BOBase, IEventReportElement
{
public long? IdEventReport
{
get { return IdParent; }
set { IdParent = value; }
}
public long? IdParent { get; set; }
}
и участок в MODELBUILDER
modelBuilder.Entity<Position>().Property(x => x.IdParent).IsRequired();
modelBuilder.Entity<Position>().Ignore(x => x.IdEventReport);
Однако, это бросает исключение уже при попытке создать базу данных:
System.InvalidOperationException: свойство 'IdEventReport' является не объявленное свойство по типу «Позиция». Убедитесь, что свойство не было явно исключено из модели, используя аннотацию Ignore или NotMappedAttribute. Убедитесь, что он является допустимым примитивным свойством.
Хотя это может быть допустимым, нельзя ли переопределить заданную конфигурацию типа для определенного типа? Нужно ли добавлять строку .IsRequired() ко всем другим типам, реализующим этот интерфейс, или есть ли другой способ преодолеть это?
Я предполагаю, что вы пытаетесь выбрать 'Position.IdEventReport' в запросе. это правильно? –
нет, IdEventReport не следует включать в модель. IEventReportElement имеет другие важные свойства, которые я хочу использовать, я просто не хочу использовать это свойство (в базе данных). – DevilSuichiro