首先执行Entity Framework(5)代码,虽然我们没有从代码生成我们的数据模型 - 我们只是手动保持它们的同步(不像听起来那么痛苦)。
尝试创建1到0-1的关系。以下是使用可能包含0或1个地址的客户的简化示例的设置:
编辑:原始示例不对。客户可以拥有0-1个地址,地址只有1个客户。表格设计和代码都已更新。
Address -------------- AddressId (identity) AddressText CustomerId (Edit: this employs a unique constraint)
Customer -------------- CustomerId (identity) CustomerName
地址映射的相关部分:
this.HasKey(t => t.AddressId);
//SEE NOTE ON THIS BELOW
//this.Property(t =>t.AddressId).
HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.HasRequired(t => t.Customer)
.WithOptional();
客户映射的相关部分:
this.HasKey(t => t.CustomerId);
this.HasOptional(b => b.Address)
.WithRequired();
请注意客户注释掉的行。如果我包含这个,我会收到以下错误:
ReferentialConstraint中的依赖属性映射到a 存储生成的列。专栏:' CustomerId'。
如果我不包含它,我会:
无法在表格中插入标识列的显式值'客户' 当IDENTITY_INSERT设置为OFF时。
我搜索了高低,上面的代码似乎是推荐的方法。我还看到一些含糊的提及,除非两个表共享一个同名的密钥,否则不能对1:1关系进行建模?
这种关系是否可以在代码中建模,如果是,那么正确的语法是什么?
答案 0 :(得分:3)
您的映射看起来无效。您是说Address
有一个可选的Customer
,Customer
有一个必需的地址,但您的Address
实体上的Customer
foriegn密钥可以为空所以这种关系应该是相反的。
另外,是的,如果你想建模一对一关系,那么你应该有一个带有主键的Customer
表,然后是一个带有主键列的Address
表。也是Customer
表的外键。
否则,您实际上是在数据库中建立一对多关系。