2

首先编写实体框架 (5) 代码,尽管我们不是从代码生成数据模型——我们只是手动保持它们同步(比听起来更痛苦)。

试图建立一个 1 对 0-1 的关系。这是使用可能具有 0 或 1 个地址的客户的虚构示例的设置:

编辑:原始示例不正确。客户可以有 0-1 个地址,地址正好有 1 个客户。表设计和代码均已更新。

地址
--------------
AddressId(身份)
地址文本
CustomerId (编辑:这采用了唯一约束)
顾客
--------------
客户 ID(身份)
顾客姓名

地址映射的相关部分:

   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 中的依赖属性映射到存储生成的列。列:“客户 ID”。

如果我不包括它,我会得到:

当 IDENTITY_INSERT 设置为 OFF 时,无法在表“客户”中插入标识列的显式值。

高低搜索过,上面的代码似乎是推荐的做法。我还看到一些模糊的提及,除非两个表共享同名的键,否则无法建模 1:1 关系?

这种关系可以用代码建模吗?如果可以,正确的语法是什么?

4

1 回答 1

3

您的映射看起来无效。您是说 anAddress有一个 optional Customer,并且 aCustomer有一个必需的地址,但是您在实体Address上的外键是可以Customer为空的,所以关系应该是相反的。

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

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

于 2012-10-23T18:20:39.263 回答