在实体框架中映射1到0-1

时间:2012-10-23 18:14:02

标签: c# sql-server entity-framework entity-framework-5

首先执行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关系进行建模?

这种关系是否可以在代码中建模,如果是,那么正确的语法是什么?

1 个答案:

答案 0 :(得分:3)

您的映射看起来无效。您是说Address有一个可选的CustomerCustomer有一个必需的地址,但您的Address实体上的Customer foriegn密钥可以为空所以这种关系应该是相反的。

另外,是的,如果你想建模一对一关系,那么你应该有一个带有主键的Customer表,然后是一个带有主键列的Address表。也是Customer表的外键。

否则,您实际上是在数据库中建立一对多关系。