asp.net-mvc如何创建一对一关系对双方的关系是可选

发布时间: 2017/3/25 9:34:24
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

是否可能创建两个实体在每个实体都到另一个外的键和外键字段之间的关系也是可选的?我试着创建表基于下面的代码︰

public class Museum
{
    public int MuseumId { get; set; }
    public string Name { get; set; }

    [ForeignKey("Curator")]
    public int? CuratorId { get; set; }
    public virtual Curator Curator { get; set; }
}

public class Curator
{
    public int CuratorId { get; set; }
    public string Name { get; set; }

    [ForeignKey("Museum")]
    public int? MuseumId { get; set; }
    public virtual Museum Museum { get; set; }
}

但我得到了以下错误︰

Curator_Museum_Target:: 多重性无效角色 'Curator_Museum_Target' 在 'Curator_Museum' 的关系。因为依赖角色属性不是关键,必须依赖角色的多重性上限 ' *'。

有没有任何方法来绕过这个?

解决方法 1:

你不能在数据库中。FK 必须引用关系的另一边的 PK。PK 不能是可选的。例如,你想要 o 的关系表之间实现 AB 将具备这些条件︰

  • 如果 A.Id FK 与有关的 B.IdB.Id 必须是 PK,因此,不可选
  • 反之亦然,如果 B.Id FK 与有关的 A.IdA.Id 必须是 PK,,因此,不可选

所以,这不是模型的问题 EF,但您问题。

要对此进行模拟可以使用一个桥接表,像这种"pseducode":

[Table: ABBridge]
AId not null
BId not null

所以,如果有一种依赖形式 AB 或反之亦然,你只是要将条目添加到该表。它并没有这种关系,在此表中没有字段。两个 AId BId 应为桥接表 PK。

这将是一种多对多关系。如果您使用的是现代版的 EF (6.1 或更高版本),可以将转换它在一对一使两个 AIdBId 采用具有独特的索引属性在这两个独特。

[Index("AIdUniqueIndex", IsUnique = true)]
public int AId { get; set; }
[Index("BIdUniqueIndex", IsUnique = true)]
public int AId { get; set; }

如果您使用的旧版本,则应确保这使用业务逻辑。

官方微信
官方QQ群
31647020