2016-09-08 9 views
0

У меня есть несколько типов, которые наследуют от интерфейса «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() ко всем другим типам, реализующим этот интерфейс, или есть ли другой способ преодолеть это?

+0

Я предполагаю, что вы пытаетесь выбрать 'Position.IdEventReport' в запросе. это правильно? –

+0

нет, IdEventReport не следует включать в модель. IEventReportElement имеет другие важные свойства, которые я хочу использовать, я просто не хочу использовать это свойство (в базе данных). – DevilSuichiro

ответ

0

Я нашел решение, однако это не так приятно. Я сделал это, изменив строку конфигурации типа на

modelBuilder.Types<IEventReportElement>().Where(x=>x.Name!="Position").Configure(x=>x.Property(y=>y.IdEventReport).IsRequired()); 
0

Если вы просто хотите, чтобы в базе данных было другое имя, используйте HasColumnName.

Для доступа к IdParent в модели C# используйте [NotMapped], чтобы сообщить EF игнорировать это свойство при создании БД.

public class Position : BOBase, IEventReportElement { 
    public long? IdEventReport {get; set; } 

    [NotMapped] 
    public long? IdParent { 
     get { return IdEventReport ; } 
     set { IdEventReport = value; } 
    } 
} 

modelBuilder.Entity<Position>().Property(x => x.IdEventReport).HasColumnName("IdParent"); 

В качестве примечания стороны: почему вы используете интерфейс, который вы не хотите использовать? Возможно, вы можете разделить интерфейс на более мелкие части и реализовать только то, что собираетесь использовать.

+0

Это не то, что я хочу, так как я хочу запросить таблицу по свойству IdParent, это невозможно с этим подходом. – DevilSuichiro