【发布时间】: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