【问题标题】:Trying to set up a 0..1 : 1 relationship with SQL and Entity Framework尝试与 SQL 和实体框架建立 0..1 : 1 关系
【发布时间】:2013-11-11 13:38:10
【问题描述】:

假设我们的数据库中有两个表。

Table1 有字段:

Id
Field 2
Field 3

Table2 有字段:

Table1Id
Field 2
Field 3

现在 Table1 的 PK 是 Id,而 Table 2 的 PK 是 Table1ID(这是有道理的。)

Table1 可能有也可能没有与之相关的 Table2 实体。 (取决于Table1.Field2的值是否为3,但无论如何..)

我在 Table2 上设置了一个 FK,使得 Table1.Id 与 Table2.Table1Id 相关

我的最终目标是,当通过实体框架(顺便说一下,db-first)访问 Table1 时,我可以通过 Table1.Table2(应该为 null 或已填充)访问我的 Table2 实体。

现在,我必须执行 Table1.Table2s.First() 之类的操作

我缺少什么关系让这个 First() 不必要?

注意: 表 1 已经存在于我们的数据库中并被使用。表 2 是新事物的一部分。

这是我当前创建的 Table2 导致我的问题

CREATE TABLE Table2(
    Table1Id NUMERIC(18, 0),
    Field2 BIT NOT NULL,    
    Field3 BIT NOT NULL,    


    CONSTRAINT Table2_pk PRIMARY KEY (Table1Id ),

    CONSTRAINT FK_Table1ID
        FOREIGN KEY (Table1Id)
        REFERENCES Table1(Id)
);

即使是陌生人,在 EDMX 中一切看起来都很好

此外,EDXM 文件的关联检查出多重性 1 和 0..1

编辑:

通过足够的笨拙,这行得通。我恢复了我的模型并从头开始/再次/建立了连接,它神奇地起作用。如果我弄清楚原因,我会尝试思考为什么会这样并进行编辑。

【问题讨论】:

  • 你的模型的 C# 代码对于了解为什么你得到一个对象集合而不是单个对象是必要的
  • 我只是在调用像 var test = dbcontext.Table1.First() [single entity] 这样的实体。然后稍后我要测试.Table2。所以真的只是 EF 输出的模型,只是一个普通的模型
  • 问题不是调用代码...而是您在 EF 中配置实体的方式...您的模型有问题,而不是 SQL 或调用代码。
  • 我不明白。如果模型是由 EF(顺便说一下,4.0)制作的,那不应该与我在 SQL 中的设置方式相对应吗?即使当我使用 Linqpad 玩东西时,它对情况的感知设置是它是一个 1..n,我仍然必须每次都使用 .First()。
  • 您可以仔细检查 Table1 上“Table2”导航属性的“Multiplicity”设置吗?另外,你能深入到你的 Context.cs 并获取类定义 .cs 吗?

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


【解决方案1】:

您使用的是 DB Fist 还是 Code First?使用 DB First,它应该可以正常工作:

这是我首先使用 EF DB 时得到的图像:

这是一张图片,显示此设置确实正确地给出了单例关系:

另外,如果您使用文本编辑器编辑您的 .edmx 文件,Association 属性应定义如下:

<Association Name="FK_Table1ID">
          <End Role="Table1" Type="XOneModel.Store.Table1" Multiplicity="1" />
          <End Role="Table2" Type="XOneModel.Store.Table2" Multiplicity="0..1" />
          <ReferentialConstraint>
            <Principal Role="Table1">
              <PropertyRef Name="id" />
            </Principal>
            <Dependent Role="Table2">
              <PropertyRef Name="Table1Id" />
            </Dependent>
          </ReferentialConstraint>
        </Association>

你能仔细检查一下吗?

如果您使用 Code-First,那么您需要确保您正确定义了您的关系,并且您将 Table1 中的 Table2 成员定义为单个实例属性而不是集合...如果您'正在使用CF,你可以发布你的模型代码吗?

【讨论】:

  • 这正是我想说的,我们需要查看 EF 生成的实体,如果 SQL 看起来像上面那样,.edmx 应该看起来像这样。
  • @AndrewCounts 是的,希望我们能看到 OP 的代码并弄清楚。
  • 更改了 OP。这很奇怪。顺便说一句,数据库优先!
  • 一切正常。将在几秒钟内更新 OP。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多