假设,我有一个用于数据表示的主类,并且这个类有配置字段。该字段必须能够回答一些与主类相关的问题(假设这是一个问题 - 'IsMainClassReadyToUse')。但是这个类的内部结构可能不同。
正因为如此,我想创建抽象类 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);
我试图禁用 LazyLoading,在 DataDbContext
中添加这样的构造函数:
public DataDbContext()
{
Configuration.LazyLoadingEnabled = false;
}
但是当我尝试访问 FieldsB
时,它仍然为空。
那么,我如何使用 Entity Framework 实现这样的架构?
或者我应该为这样的任务选择另一种架构?
最佳答案
我认为你应该尝试访问你的配置器,例如
((ComplexConfigurator)yourObject.Configurator).FieldsB
但我担心 EF 在 List<int>
上工作有误属性(当我尝试这样做时,有时会失败),更好的方法是创建类 Option
和场List<Option> Options
进入您的配置器,而不是使用整数列表。
您还应该检查您的数据库方案(应该有一个表“Configurators”,其中包含标识符字段以及所有 SimpleConfigurator 和 ComplexConfigurator 的字段)。也许你应该添加 DbSet<Configurator>
进入您的 DbContext 定义。
你可以阅读这个 article以获取有关继承和 EF 的更多信息。
关于c# - 如何在 Entity Framework 中使用继承类的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32964595/