Entity framework 4 EF4:创建0..1到多个关联

Entity framework 4 EF4:创建0..1到多个关联,entity-framework-4,mapping,entity-relationship,Entity Framework 4,Mapping,Entity Relationship,我正在尝试添加一个我原来没有的关联。我意识到这两个表在技术上是相关的,一些导航属性可能会简化我本来必须手动执行的操作。表及其键如下所示: Import Primary Key: Number : Int32 Date : DateTime Hour Primary Key: DepartmentID : Int32 UserNumber : Int32 Date : DateTime 该协会名为ImportHour。Import.Number映射到Hour.Us

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

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。我正在尝试添加一个关联,该关联在导入时为0..1,在小时时为*且具有导航属性且没有其他外键。当我这样做时,设计器告诉我关联没有映射。如果生成DDL,它将创建新字段Hours.Import\u Date和Hours.Import\u 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>*
错误3021:映射从第332行开始的片段时出现问题:
表“小时数”中的以下每列都映射到多个概念侧属性:
小时。日期映射到
Hours.UserNumber已映射到*

我不确定到底发生了什么,我认为我对“映射”过程的理解还不够透彻,无法弄清楚这一点。它似乎想要一个五重键,而没有意识到一个键映射到另一个键。我查看另一个一对多关联,它们甚至没有表映射;我认为它们有引用约束,但显然不能有0..1对多关联的引用约束。

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

导入时不能有0..1,因为在这种情况下
小时中的
用户号
日期
必须为空。这就是那种关系的意思。如果不存在主体实体(
Import
),则从属实体(
Hour
)中的FK属性将为空


顺便说一句,在主键中使用
DateTime

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

@Sahuagin这可能在您的问题之后很久,但您是否尝试在添加关联、删除设计器中的标量属性之后——例如在创建ImportHour关联之后,从小时实体中删除hour.usernumber和hour.date。
这样,以这种方式建立的独立关联是您或实体之间的唯一关系-这就是独立关联的含义

您是如何创建实体对象的?您是否对实体对象进行过任何自定义?如果没有,作为最后一项工作,只需重建对象(我假设您在VS中使用了模板)。如果生成POCO支持,然后将POCO实体从ObjectContext拆分为单独的库,则可能会出现问题。我使用设计器构建实体对象,然后使用“从模型生成数据库”生成一个.sql文件,并执行该文件来创建数据库。我没有添加任何自定义项。我似乎已经通过选择一个1对多关联来“修复”它,并使用我先前存在的列使用引用约束。不确定如果我尝试加载没有匹配导入值的小时数值会发生什么情况。导入时不能有0..1,因为在这种情况下,以小时为单位的UserNumber和Date必须为空。好啊那是威德。我想我想要的是一个能够实现完全外部连接的东西,因为这两个表中可能有记录,也可能没有记录。不建议在主键中使用DateTime。链接中给出的任何理由都不适用,DDL还是从.NET DateTime类型生成了我的表;据我所知,没有.NET日期类型。这种情况下的记录应该是当天唯一的。如果要支持完全外部联接之类的方案,则必须使FKs可为空,否则不能有没有父实体的相关实体。这似乎适用于1对多关联。我唯一不确定的是,如果使用Hour.Import导航属性(如果没有记录,则导入导航属性)(这就是为什么我认为应该使用0..1)。我想我试图实现的目标在技术上确实没有EF的支持。使用动态SQL,我可以设置这样一种情况:给定一个小时记录,我可以找到零个或一个导入记录,给定一个导入记录,我可以找到多个(0..*)小时记录,它不需要可为空的键或任何东西。一旦在数据库中定义了FK,就不能填写不存在导入的编号和日期。这是引用完整性的全部含义。我知道,但在这个场景中没有FK约束。它甚至不是一个真正的“外键”,更重要的是记录恰好按日期和用户编号匹配,而不是小时表与导入表有严格的关系。这是一种较弱的关联,给定日期和用户号,我可以找到0..1个导入和0..*h。(或者给定一个导入,我可以找到0..*Hours,给定一个小时,我可以找到0..1个导入)。如果我记得,删除标量属性会导致映射错误。我可能误解了
0..1到*
关联的含义;据我所知,将
1改为*
是有效的。从那以后,这个数据库就一直在使用,从那以后我就再也没有对它进行过修补。