【问题标题】:Mapping 1 to 0-1 In Entity Framework在实体框架中映射 1 到 0-1
【发布时间】:2012-10-23 18:14:02
【问题描述】:

首先编写实体框架 (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(); 

注意在 Customer 中注释掉的行。如果我包含这个,我会收到以下错误:

ReferentialConstraint 中的依赖属性映射到 商店生成的列。列:“客户 ID”。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您的映射看起来无效。您是说Address 有一个可选的Customer,而Customer 有一个必需的地址,但是Customer 实体上的Address 外键是可空的,所以关系应该是相反的.

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

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

    【讨论】:

    • 对不起,这个例子有缺陷。你能再看看吗?
    • 好的,您仍在为数据库中的一对多关系建模。从 Address 表中移除 CustomerId 外键,并将主键 (AddressId) 设为外键。原因是为了确保主体端(客户)中的每个实体在依赖端(地址)中不存在超过一个实体,因为主键约束强制执行唯一性。
    • Address 上的 CustomerId 有一个唯一的约束,这有效地使其成为 1:1(并且 SQL Server 可以识别它)。我应该在我最初的帖子中提到这一点(编辑添加它)。
    • 啊,好吧,这个 CustomerId 列是否被标记为标识列?
    • 在数据库中,两个 PK 都设置为身份。两者似乎都符合 EF 的约定,假设它们也是代码中的标识。正如注释掉的代码所指出的那样,如果我明确地将 AddressId 作为身份调用,我会得到不同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多