【问题标题】:EF: how do i model 1:1 without db referential integrity?EF:我如何在没有数据库参照完整性的情况下进行 1:1 建模?
【发布时间】:2011-11-10 16:35:28
【问题描述】:

考虑下表:

Base, Primary key: Id
Extension, Primary key: Id

“扩展”表中的主键与“基”表中的主键具有相同的值。我想在 edmx 中这样建模:

Base 可以有 0..1(零或一)个 Extension 实例。

扩展可以有 1(一)个 Base 实例。使用 Extension.Base 访问 Base 实例。

当我尝试指定此关联的映射详细信息时,我收到如下错误:

“错误 3021:从第 xx 行开始映射片段时出现问题:每个 表 Base 中的以下列映射到多个概念 侧属性:Base.ID 映射到 "

如何建模不受数据库关系支持的 1:0..1 关系?我基本上想要一个关系,所以我可以使用 Linq 查询我的读取模型。

【问题讨论】:

  • 实体框架强烈依赖于数据库级别,因此要完成这项工作,您应该添加与数据库的关系。应该可以在不更改数据库的情况下在 EF 中实现这一点,但它仅在某些时候有效——尤其是当您尝试修改数据时。

标签: c# entity-framework


【解决方案1】:

如果我没看错,那么你做的事情类似于我不得不在消息传递系统中解决的问题。

基本上,我创建了一个中间表,其中包含 2 列,均为整数,其中 1 列保存一个表的 id,另一个保存另一个表的 id,然后我可以将两者连接在一起。

所以EG:

--------------------------
| Base ID | Extension ID |
--------------------------

不过,我确实必须手动管理表格,所以需要做一些额外的工作,但它成功了。

也许不是您需要的确切架构,但我认为无论您的方案如何,中间表都是满足您需求的明智方式。

【讨论】:

  • 这在数据库中没有参照完整性的情况下有效吗?您是如何在 edmx 中对此进行建模的?
  • 是的,确实做到了。我在我的数据库中手动创建了表格,我自己添加了 FK 链接,然后我只是将 EF 指向它,并告诉它创建模型。既然设计没有什么特别之处,那么先编码或先模型应该没有问题。
【解决方案2】:

您应该修改您的模式类,如下所示以实现 1:1 关系:-

基类

public class Base
{
    public int BaseID;
    public int ExtentionID;
    public virtual Extention Extension { get; set; }
}

扩展类

public class Extention
{
    public int ExtentionID;
    public int BaseID;
    public Base Base { get; set; }
}

【讨论】:

  • 正在使用 t4 模板从 edmx 生成 POCO,所以我更感兴趣的是它在您的 edmx 文件中的外观。
  • ohh k...我想你可能会喜欢这个。因为它确实是处理表格和模型的好方法。无论如何,对于我不相关的答案感到抱歉。
  • 我不是说你的帖子无关紧要,我只是说它很短:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2019-05-05
  • 2016-05-31
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多