我正在尝试添加一个我原本没有的关联。我意识到两个表在技术上是相关的,并且一些导航属性可能会简化我本来必须手动执行的操作。表及其键如下所示:
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的关联,在导航属性上添加* on 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到多个关联的参照约束。
答案 0 :(得分:1)
有两种方法可以定义关系,但在您的情况下,您必须使用外键关联。这意味着一旦您在实体模型中绘制关联,您必须select it and define referential constraints。
Import
上不能有0..1,因为在UserNumber
Date
和Hour
中的Import
必须可以为空。这就是那种关系的意思。如果不存在主体实体(Hour
),则依赖实体(DateTime
)中的FK属性将为空。
顺便说一下。在主键中使用{{1}}为not recommended。
答案 1 :(得分:0)
据我所知,从我使用的其他数据库来看,这里的问题似乎是EF模型需要在数据库中已经存在外键。虽然我似乎无法让EF生成一个,但如果它已经存在,它将接受一个。 (与我在问题中所说的相反,你可以对0..1到多个(可为空的)外键有一个引用约束。)
答案 2 :(得分:0)
@Sahuagin这可能在您的问题之后很久但是您在添加关联后尝试删除设计器中的标量属性 - 创建ImportHour关联后的示例,从您的小时实体中删除hour.usernumber和hour.date 。 这样,以这种方式建立的独立协会是唯一实体之间的唯一关系 - 这就是独立协会的意义