2015-10-06 65 views
4

假設我有用於數據表示的主類,並且此類具有配置字段。該字段必須能夠回答與主類相關的一些問題(假設這是一個問題 - 'IsMainClassReadyToUse')。但是這個階級的內部結構可能會有所不同。如何在實體框架中使用繼承類的字段

因此,我想創建abstract class Configurator並根據情況使用各種實現其功能的Configuratos

所以,我有以下代碼:

public class SimpleConfigurator : Configurator 
{ 
    public int FieldA { get; set; } 
    public override bool IsDataClassReadyToUse() 
    { 
     return ParentDataClass.FieldA == FieldA; 
    } 
} 

public class ComplexConfigurator : Configurator 
{ 
    public virtual List<int> FieldsB { get; set; } 
    public override bool IsDataClassReadyToUse() 
    { 
     return ParentDataClass.FieldsB.All(x => FieldsB.Any(y => y == x)); 
    } 
} 

public abstract class Configurator 
{ 
    public int ConfiguratorId { get; set; } 
    public virtual DataClass ParentDataClass { get; set; } 
    public abstract bool IsDataClassReadyToUse(); 
} 

public class DataClass 
{ 
    public int DataClassId { get; set; } 
    public virtual Configurator Configurator { get; set; } 
    public int FieldA { get; set; } 
    public virtual List<int> FieldsB { get; set; } 
} 

public class DataDbContext : DbContext 
{ 
    public DbSet<DataClass> DataClasses { get; set; } 
} 

但是當我嘗試使用DataClass實例與ComplexConfigurator類型的Configurator出現的問題。

因爲惰性加載的,我需要從ComplexConfigurator加載FieldsB,但abstract class Configurator不包含這樣的領域,我不會寫這樣的代碼:

new DataDbContext().DataClasses 
        .Include(m => m.Configurator) 
        .Include(m => m.Configurator.FieldsB); 

我試圖禁用惰性加載,在DataDbContext加入這樣的構造:

public DataDbContext() 
{ 
    Configuration.LazyLoadingEnabled = false; 
} 

但是,當我嘗試訪問FieldsB它仍然爲空。

那麼,我該如何實現這樣的架構與實體框架?

或者我應該選擇另一個架構來完成這樣的任務?

+0

您的'DataDbContext'沒有'Configurator'的'DbSet',所以如果您能夠訪問'Configurator'成員,更不用說'FieldsB'屬性,我會感到驚訝。 –

+0

@Gary這個例子在'SimpleConfigurator'上可以正常工作,我們甚至可以在'DataDbContext'中很容易地訪問它的實例,甚至是'DbSet'。我想,Entity Framework本身可能會爲Configurator對象創建數據庫。這不是真的? –

+0

您是否嘗試過'.Include(「Configurator.FieldsB」)'。我目前沒有時間設置本地數據庫並進行測試,但理論上應該試圖加載有問題的屬性;儘管如此,我不能說生成的SQL會很有效率。 –

回答

0

我想你應該嘗試訪問您配置如

((ComplexConfigurator)yourObject.Configurator).FieldsB

但我怕EF工作錯List<int>財產(當我試圖做到這一點,有時我有一個失敗),更好的方法是創建類Option和字段List<Option> Options進入您的配置器而不是使用整數列表。你也應該檢查你的數據庫方案(應該有一個帶有標識符字段和所有SimpleConfigurator和ComplexConfigurator字段的「Configurator」表)。也許你應該在你的DbContext定義中加入DbSet<Configurator>

您可以閱讀這個以獲取有關繼承和EF的更多信息。