c# - 如何在 Entity Framework 中使用继承类的字段

标签 c# asp.net entity-framework

假设,我有一个用于数据表示的主类,并且这个类有配置字段。该字段必须能够回答一些与主类相关的问题(假设这是一个问题 - '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/

相关文章:

c# - 在 .Net Core 2.0 + SQLite EFCore 中,并发检查不适用于 'delete'

c# - WebClient 下载字符串与 WebBrowser 查看源代码不同

c# - 从 C# 调用 Freebase Provider 时 FSharp.Data 'System.MissingMethodException'

asp.net - VB.NET 检查带有 ID 的 XML 节点是否存在

c# - 使用 C# 更新另一台机器(共享文件夹/网络)上存在的文件(web.config)中的值

c# - 使用 LINQ to Entities 的条件投影

c# - 以 XML 形式获取 WCF web 服务响应

c# - 使用 c# SslStream 的直接 SSL/TLS(无 CONNECT 消息)MITM 代理

c# - 关于Visual Studio 2010内置Web应用程序的问题

c# - Entity Framework 代码优先 - 接口(interface)