2016-09-08 31 views
0

我有很多類型,從界面「IEventReportElement」,這暴露了財產繼承的接口的所有類型的特定屬性配置「IdEventReport」:對實現除一

public interface IEventReportElement 
{ 
    long Id { get; set; } 
    long? IdEventReport { get; set; } 
} 

這是一個可以爲空的屬性,因爲我並不總是能夠立即正確地填寫它,但應該在數據庫中不能爲空。

爲什麼我添加了這行

modelBuilder.Types<IEventReportElement>().Configure(x=>x.Property(y=>y.IdEventReport).IsRequired()); 

在我的DbContext方法OnModelCreating那。

然而,鍵入「位置」必須實現這個接口,但是不應該在數據庫屬性「IdEventReport」之列,而是爲屬性「IdParent」這暴露了一個列。

System.InvalidOperationException:該物業 'IdEventReport' 是

public class Position : BOBase, IEventReportElement 
{ 
    public long? IdEventReport 
    { 
     get { return IdParent; } 
     set { IdParent = value; } 
    } 

    public long? IdParent { get; set; } 
} 

,並在模型構建器

 modelBuilder.Entity<Position>().Property(x => x.IdParent).IsRequired(); 
     modelBuilder.Entity<Position>().Ignore(x => x.IdEventReport); 

然而部分,這個試圖創建數據庫時已經拋出異常不是'Position'類型的聲明屬性。通過使用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

要在C#模型中訪問IdParent,請使用[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