【问题标题】:Table-per-Type Code First - How to differentiate if Base type is sub typeTable-per-Type Code First - 如何区分基本类型是否为子类型
【发布时间】:2015-12-16 15:55:42
【问题描述】:

我确定我的问题源于对 Base 类型/Sub 类型实体之间的确切关联方式的误解,但请耐心等待。

假设我有两个班级:

public class Business
{
    public int UniqueID { get; set; }
    public string Name { get; set; }
}

public class BusinessType1 : Business
{
    public string SomeRelatedThing { get; set; }
}

public class BusinessType2 : Business
{
    public string SomeNotRelatedThing { get; set; }
}

在我的应用程序中,我大部分都使用基本类型。然而,有些页面与 Sub 类型相关,但需要足够通用以处理任何一种 (DNRY)。

页面仅在上下文中给出基本类型,并且必须从 BusinessType1 或 BusinessType2 加载数据。

我面临的问题是我需要确定基本类型(业务)是否与 BusinessType1 或 BusinessType2 相关联。我宁愿这样做而不进行查询以确定每个表中是否存在键。

据我所知,这是不可能的 - 因此我的问题是;

有没有办法通过对数据库的最少查询来实现这一点?

【问题讨论】:

  • BusinessType1BusinessType2 都是Business 的子类型(子类),而不是超类型。我喜欢称它为基类而不是超类型,但它们是相同的,在这种情况下Business 是超类型。您应该进行编辑以避免混淆。
  • 天哪,我打错了。谢谢你捡起来!我敢肯定那一定令人困惑
  • 我不明白为什么需要查询db来确定实际类型(在客户端代码中明确定义)?只需简单地使用is 运算符?
  • 我想这是我的问题。 EF 是否返回了一个对象,其中“is”将评估或仅返回基本类型,其中“is”无关紧要。

标签: c# entity-framework ef-code-first superclass


【解决方案1】:

我将尝试通过示例扩展@Hopeless。

获取所有实体,然后确定基本类型:

var entities = context.Business.ToList();
foreach(var baseEntity in entities)
{
    // some common logic for base entity type

    if (baseEntity is BusinessType1)
    {
        var concreteEntity = (BusinessType1)baseEntity;
        // some logic for entity of BusinessType1
    }
}

仅获取具有具体类型的实体:

var concreteEntities = context.Business.OfType<BusinessType1>().ToList();
// some logic for entities of BusinessType1

如您所见,您无需使用 Entity Framework 执行任何其他查询。

【讨论】:

  • 感谢您的详细回答。像魅力一样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多