是否可以使用Entity Framework将“外键”建模到多个表中?

时间:2011-01-13 04:27:12

标签: entity-framework entity-framework-4

我有一个MS SQL 2008数据库,我无法更改其架构。我必须处理它是什么。 它有三个与问题相关的表格。

  1. 产品表。列是:

    • Id(身份,PK)
    • 组(非空)
    • 子组(非空)
    • 代码(唯一,非空)
    • 描述
  2. 合约表。列是:

    • Id(身份,PK)
    • 代码(非空)
    • Descritpion
  3. 折扣表。列是:

    • Id(身份,PK)
    • 类型(限制为四个值中的一个:
      • '产品',
      • '基团',
      • 'subgroup'或
      • 'contract')(非空)
    • 对象(取决于Type的值是指四个中的一个:
      • Product.Code
      • Product.Group
      • Product.SubGroup
      • Contract.Code)(非空)
    • 价值(非空)
  4. 这个想法是折扣可以应用于四个中的任何一个。我想重申一下,这是我无法改变的数据库设计。

    使用Entity Framework我可以使用连接查询表,但我不能使用开箱即用的导航属性,因为导航属性是基于数据库中的外键关系生成的,并且您无法定义“条件” MS SQL中的关系,当字段类型包含此值时,字段对象与一个表相关,当值不同时,字段对象与另一个表相关。

    我的问题是:是否可以使用Entity Framework定义类和映射,以便在此方案中使用导航属性?例如,我做了Discount.Object,我收到了Contract对象或Product对象作为响应,如果这是一个Product对象,则会在右侧属性中检索它。

    这是可能的,或类似的东西,或加入是我能做的最好的事情吗?

2 个答案:

答案 0 :(得分:1)

您说“这是我无法更改的数据库设计”,但是如果不更改现有表,您至少可以添加视图吗?

如果可以,您可以为Discount表创建一个视图,该视图为每个关系提供四个不同的可为空的列。这将很好地映射到EF作为四个导航属性。

执行此操作后,如果您仍需要组合列,则可以将自己的属性添加到Discount实体,该实体将通过检查四个导航属性中的哪一个不为null来返回object,并返回链接实体。

答案 1 :(得分:0)

您无法像这样创建关系数据库。每个潜在父行的密钥都需要单独的列。