【问题标题】:Type casting in TPC inheritanceTPC 继承中的类型转换
【发布时间】:2014-10-17 05:03:55
【问题描述】:

我有几个产品,如 HotelProduct、FlightProduct ... 从 BaseProduct 类派生。这些产品的表格将在数据库中以TPC方式生成。有一个具有 BaseProduct 的 OrderLine 类。

我的问题是,当我选择带有相关产品的 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 的属性。有没有办法将 BaseProduct 转换为 OrderLine 或任何其他解决方案中的派生类?

【问题讨论】:

  • 不是自动创建为派生实例吗?
  • 不,即使我使用OfType,它也只是创建基类。

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


【解决方案1】:

我认为您想要做的事情在 TPC 策略下是不可能的。考虑OrderLine 上的ProductId 属性:它是HotelProduct 表还是FlightProduct 表的FK?它只能是一个,因此Product 属性只能映射到与HotelProductFlightProduct 的关联。

您至少有两种选择:

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

【讨论】:

  • 是的解决方案是在 OrderLine 中使用 HotelProduct 和 FlightProduct,但是对于每个产品,我必须向 OrderLine 添加另一个产品属性,最后在 OrderLine 中有很多产品属性。我不使用 TPT 的原因是该表中会有很多产品,并且连接成本会很高,但在这种情况下,我不太确定,如果我错了,请让我清楚.
  • @MohsenEsmailpour,跨链接主键的连接将非常快。我不会担心的。
  • 谢谢@Steve,有没有关于这个主题的资源可以让你更深入地理解?
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 2021-12-27
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 2012-11-29
相关资源
最近更新 更多