【问题标题】:EF4: Creating a 0..1 to Many AssociationEF4:创建 0..1 到多关联
【发布时间】:2013-07-05 09:01:20
【问题描述】:

我正在尝试添加一个我最初没有的关联。我意识到两个表在技术上是相关的,并且一些导航属性可能会简化我原本必须手动执行的操作。表及其键如下所示:

Import
Primary Key:
   Number : Int32
   Date : DateTime

Hour
Primary Key:
   DepartmentID : Int32
   UserNumber : Int32
   Date : DateTime

该关联名为 ImportHour。 Import.Number 映射到 Hour.UserNumber,Import.Date 映射到 Hour.Date。我正在尝试在 Import 上添加一个 0..1 的关联,在 Hour 上添加一个带有导航属性且没有其他外键的 * 关联。当我这样做时,设计师告诉我关联没有映射。如果我随后生成 DDL,它会创建新字段 Hours.Import_Date 和 Hours.Import_Number(Hours 是 Hour 实体的实际数据库表名)。如果我手动映射字段,我最终会出现以下错误:

Error 3021: Problem in mapping fragments starting at line 332:
Each of the following columns in table Hours is mapped to multiple conceptual side properties:
Hours.Date is mapped to <ImportHour.Hour.Date, ImportHour.Import.Date>
Hours.UserNumber is mapped to <ImportHour.Hour.UserNumber, ImportHour.Import.Number>*

我不太确定发生了什么,而且我认为我对“映射”过程的理解不足以弄清楚这一点。它几乎似乎想要一个五元组键,而不是意识到一个键映射到另一个键。我查看了我的其他一对多关联,它们甚至没有表映射;我认为它们具有引用约束,但您显然不能具有 0..1 到多关联的引用约束。

【问题讨论】:

  • 您是如何创建实体对象的?您是否对实体对象进行了任何自定义?如果没有,作为最后的努力,只需重建对象(我假设您在 VS 中使用了模板)。如果您生成 POCO 支持,然后将 POCO 实体从 ObjectContext 拆分为单独的库,则可能会出现问题。
  • 我使用设计器构建了实体对象,然后使用“从模型生成数据库”生成了一个 .sql 文件,我执行该文件来创建数据库。我没有添加任何自定义。
  • 我似乎已经通过选择一对多关联来“修复”它,并使用我预先存在的列进行引用约束。不知道如果我尝试加载没有匹配导入值的小时值会发生什么。

标签: entity-framework-4 mapping entity-relationship


【解决方案1】:

有两种方法可以定义关系,但在您的情况下,您必须使用外键关联。这意味着一旦您在实体模型中绘制关联,您必须select it and define referential constraints

Import 上不能有 0..1,因为在这种情况下,Hour 中的 UserNumberDate 必须可以为空。这就是这种关系的意思。如果不存在主体实体 (Import),从属实体 (Hour) 中的 FK 属性将为空。

顺便说一句。在主键中使用DateTimenot recommended

【讨论】:

  • 您不能在导入时使用 0..1,因为在这种情况下,UserNumber 和 Date in Hour 必须可以为空。 好的……这很奇怪。我想我想要的是能够启用完全外部连接的东西,因为两个表中可能有也可能没有记录。 不建议在主键中使用 DateTime。 链接中给出的原因均不适用,并且 DDL 使我的表仍然是 .NET DateTime 类型;据我所知,没有 .NET Date 类型。这种情况下的记录应该是当天唯一的。
  • 如果你想支持像完全外连接这样的场景,你必须让 FK 可以为空,否则你不能有没有父实体的相关实体。
  • 它似乎适用于一对多关联。我唯一不确定的是如果我使用 Hour.Import 导航属性会发生什么,如果那里没有记录(这就是为什么我认为我应该使用 0..1)。我想我试图完成的事情在技术上确实不受 EF 支持。使用动态 SQL,我可以设置这样一种情况:给定 Hour 记录,我可以找到零个或一个 Import 记录,并且给定 Import 记录,我可以找到许多 (0..*) Hour 记录,并且它不需要可为空的键或任何东西。
  • 一旦您在数据库中定义了 FK,您就不能填写不存在导入的编号和日期。这是参照完整性的全部含义。
  • 我知道,但在这种情况下,没有 FK 约束。它甚至不是真正的“外键”,更多的是记录碰巧按日期和用户编号匹配,而不是小时表与导入表有严格的关系。这是一种较弱的关联,在给定日期和用户编号的情况下,我可以找到 0..1 进口和 0..* 小时。 (或者给定一个导入,我可以找到 0..* 小时,给定一个小时,我可以找到 0..1 个导入)。
【解决方案2】:

据我从使用过的其他数据库中可以看出,这里的问题似乎是 EF 模型需要数据库中已经存在的外键。虽然我似乎无法让 EF 生成一个,但如果它已经存在,它将接受一个。 (与我在问题中所说的相反,您可以对 0..1 到多个(可为空的)外键具有引用约束。

【讨论】:

    【解决方案3】:

    @Sahuagin 这可能在您的问题之后很久,但是您是否在添加关联、删除设计器中的标量属性后尝试过——例如在创建 ImportHour 关联后,从您的小时实体中删除 hour.usernumber 和 hour.date . 这样建立起来的独立关联,是你们实体之间唯一的关系——这就是独立关联的意思

    【讨论】:

    • 如果我记得,删除标量属性给了我映射错误。我可能误解了0..1 to * 关联的含义;据我所知,使它1 to * 起作用了。从那时起,该数据库就一直在使用,从那以后我就没有修改过它。
    猜你喜欢
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2016-04-03
    • 2020-08-02
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多