在TPC继承中键入强制转换

时间:2014-08-23 13:15:54

标签: entity-framework inheritance casting linq-to-entities entity-relationship

我有几个产品,如HotelProduct,FlightProduct ......,它们派生自BaseProduct类。这些产品的表格将以TPC方式在数据库中生成。 OrderLine类有一个BaseProduct。 enter image description here

我的问题是,当我选择带有相关产品的OrderLine时,我不知道如何将BaseProduct转换为派生产品。例如,我有这个查询:

var order = (from odr in _context.Orders
        join orderLine in _context.OrderLines on odr.Id equals orderLine.OrderId
        join hotel in _context.Products.OfType<HotelProduct>() on orderLine.ProductId equals hotel.Id
        where odr.UserId == userId && odr.Id == orderId
        orderby odr.OrderDate descending
        select odr).SingleOrDefault();

在OrderLine中,我有BaseProduct属性而不是HotelProduct的属性。有没有办法在OrderLine或任何其他解决方案中将BaseProduct转换为派生类?

1 个答案:

答案 0 :(得分:0)

我认为您想要做的事情是TPC战略无法做到的。考虑ProductId上的OrderLine属性:它是HotelProduct表或FlightProduct表的FK吗?它只能是一个,因此Product属性只能映射到HotelProductFlightProduct的关联。

您至少有两种选择:

  • ProductId / Product属性替换为HotelProduct / HotelProductId FlightProduct / FlightProductId属性OrderLine,您可以导航到您想要的产品类型;或者,
  • 切换到“每种类型的表”策略,因此HotelProductFlightProduct表与第三个与OrderLine表有关系的Product表具有1-0,1的关系。