У меня есть несколько типов, которые наследуются от интерфейса «IEventReportElement», который предоставляет свойство «IdEventReport»:
public interface IEventReportElement
{
long Id { get; set; }
long? IdEventReport { get; set; }
}
Это свойство, допускающее значение NULL, так как я не всегда могу сразу правильно его заполнить, но оно не должно быть обнуляемым в базе данных.
Вот почему я добавил строку
modelBuilder.Types<IEventReportElement>().Configure(x=>x.Property(y=>y.IdEventReport).IsRequired());
к моему методу OnModelCreating в DbContext.
Однако тип «Позиция» должен реализовывать этот интерфейс, но НЕ должен иметь столбец для свойства «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
в запросе. это правильно? - person Adil Mammadov   schedule 08.09.2016