【发布时间】:2016-01-03 01:17:22
【问题描述】:
假设,我有数据表示的主类,而这个类有配置字段。该字段必须能够回答一些与主类相关的问题(假设这是一个问题 - '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; }
}
但是当我尝试使用Configurator 类型为ComplexConfigurator 的DataClass 实例时出现问题。
由于 LazyLoading 我需要从 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 来实现这样的架构呢?
或者我应该为这样的任务选择另一种架构?
【问题讨论】:
-
您的
DataDbContext没有DbSet和Configurator,所以如果您能够访问Configurator成员,我会感到惊讶,更不用说FieldsB属性了。 -
@Gary 这个例子在
SimpleConfigurator下工作得很好,即使DataDbContext中没有DbSet,我们也可以轻松访问它的实例。我想,实体框架本身可能会为Configurator对象创建数据库。不是真的吗? -
你试过
.Include("Configurator.FieldsB")。我目前没有时间设置本地数据库并对其进行测试,但理论上应该尝试加载有问题的属性;不过,我不能说生成的 SQL 会很高效。 -
@Richard 我收到
A specified Include path is not valid错误。 -
@NikitaSivukhin 将您课程中的
List<int>更改为ICollection<int>。
标签: c# asp.net entity-framework