【问题标题】:Get type of Entity in EF TPT Inheritance获取 EF TPT 继承中的实体类型
【发布时间】:2017-02-03 14:17:55
【问题描述】:

我的域实体使用 EF Table Per Type Inheritance,这是关系。

如您所见,Invoices 位于父实体 Order.cs 上。现在,当我处理发票时,这给我带来了问题。

例如,要创建发票,我需要将订单 ID 传递给发票控制器:

public ActionResult Create(int orderId)
{
  if (orderId == 0) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

  // determine whether the order is a SaleOrder or a PurchaseOrder
  // then create the viewModel passing in the SaleOrder / PurchaseOrder details
  return View(viewModel);
}

如何仅通过其 Id 确定订单的子类型?

更新

Theo 询问我目前如何检索 SaleOrders 和 PurchaseOrders。我在我的上下文中有这个:

public DbSet<PurchaseOrder> PurchaseOrders { get; set; }
public DbSet<SaleOrder> SaleOrders { get; set; }

我已经围绕每个构建了一个存储库,所以我有一个 PurchaseOrderRepository 和一个 SaleOrderRepository 并且我以这种方式执行我的 CRUD。

【问题讨论】:

  • 这取决于许多事情。您将 SO 和 PO 存储在同一个表中还是不同表中?您实际上如何检索它们?分配给订单类型的 ID 范围之间有什么区别吗?您是否不愿意设置某种控制机制来跟踪哪些 ID 分配给了哪种订单类型?
  • @Theo,他已经说过这是TPT策略
  • 是的,每个人都有自己的桌子,这就是 TPT 的“意思”。但我添加了一些其他可能有用的信息
  • 啊...重新阅读,我现在明白了。不知道我是怎么错过的。
  • 如果您需要知道键背后的类型,那么您的设计中的某些东西违背了类继承的目的。理想情况下,您应该创建一个(通用?)存储库,将类型限制为 Order 类层次结构,并且它应该独立于具体类型完成其工作。

标签: c# entity-framework asp.net-mvc-5


【解决方案1】:

如果两个类继承自同一个类,您可以创建另一个 DbSet

public DbSet<Order> Orders { get; set; }

并在您的操作中要求这样的顺序

    public ActionResult Create(int orderId)
    {
      if (orderId == 0) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
      var order = db.Orders.Find(orderId);
      if(order is SaleOrder){
        //do your stuff for SaleOrder
      }
      if(order is PurchaseOrder){
        //do your stuff for PurchaseOrder
      }          
      return View(viewModel);
    }

【讨论】:

  • 嗯,这给了我统一我的SaleOrderRepositoryPurchaseOrderRepository 的想法!也可以这样吗?或者如果我想带回所有 PurchaseOrders,我是否需要这些单独的
猜你喜欢
  • 2014-12-18
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
相关资源
最近更新 更多