假設我有用於數據表示的主類,並且此類具有配置字段。該字段必須能夠回答與主類相關的一些問題(假設這是一個問題 - '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
它仍然爲空。
那麼,我該如何實現這樣的架構與實體框架?
或者我應該選擇另一個架構來完成這樣的任務?
您的'DataDbContext'沒有'Configurator'的'DbSet',所以如果您能夠訪問'Configurator'成員,更不用說'FieldsB'屬性,我會感到驚訝。 –
@Gary這個例子在'SimpleConfigurator'上可以正常工作,我們甚至可以在'DataDbContext'中很容易地訪問它的實例,甚至是'DbSet'。我想,Entity Framework本身可能會爲Configurator對象創建數據庫。這不是真的? –
您是否嘗試過'.Include(「Configurator.FieldsB」)'。我目前沒有時間設置本地數據庫並進行測試,但理論上應該試圖加載有問題的屬性;儘管如此,我不能說生成的SQL會很有效率。 –