【问题标题】:How can I define a 1:c relationship in EF Code First如何在 EF Code First 中定义 1:c 关系
【发布时间】:2011-10-20 08:30:00
【问题描述】:

我有以下型号:

public class Device
{
    [Key]
    public int ID { get; set; }

    public int? SimCardID{ get; set; }

    [ForeignKey("SimCardID")]
    public virtual SimCard { get; set; }

    [DataType(DataType.Text)]
    [Required]
    [MaxLength(16)]
    public string Imei { get; set; }

    [DataType(DataType.Text)]
    [Required]
    [MaxLength(20)]
    public string Name { get; set; }
}

public class SimCard
{
    [Key]
    public int ID { get; set; }

    [DataType(DataType.PhoneNumber)]
    [Required]
    [MaxLength(20)]
    public string PhoneNumber { get; set; }

    [DataType(DataType.Text)]
    [Required]
    [MaxLength(40)]
    public string SerialNumber { get; set; }

    [DataType(DataType.Text)]
    [Required]
    [MaxLength(20)]
    public string Provider { get; set; }
}

一个设备 (1) 最多有一个 (c) sim 卡。因此关系为 1:c。如何在 EF Code First 中实现它?

【问题讨论】:

  • 如果您不使用链接表,您的设计是正确的。有什么问题?
  • EF生成的数据库对于这些模型是一对多(1:mc)的关系
  • 一张SIM卡可以在多个设备上使用。
  • 不,SIM 卡在一个设备中或没有设备(有库存但未使用)
  • 设备也可以没有安装 SimCard 吗?

标签: database-design entity-framework-4.1 ef-code-first


【解决方案1】:

这种关系不能用 EF 映射,甚至在数据库中也不起作用。

您说 SIM 车可以在没有设备的情况下存在。没关系,但您还说设备可以在没有 SIM 卡的情况下存在,并且您仍然需要参照完整性和一对一的关系。什么意思?

表示Device表必须有:

  • FK 列到 SIM 卡(关系)
  • FK 列必须可以为空(设备可以在没有 SIM 卡的情况下存在)
  • FK 列必须有唯一索引(sim 卡只能分配给一个设备)

第一个问题是在数据库中。如果您将唯一索引放置到可空列,您会得到一些令人惊讶的结果 - null 被视为值,并且只有单个记录可以分配 null,否则将违反唯一约束 => 这意味着您只能拥有一个没有 sim 卡的设备。

第二个问题在 EF 中。 EF 不支持唯一键,因此它看不到这种一对一的关系(并且它不会为您创建索引)。在 EF 中使用真正的一对一关系的唯一可能性是将 FK 放在设备的 PK 上 = 设备将具有与 SIM 相同的 PK 值,但在这种情况下,您不能拥有没有 SIM 卡的设备。

【讨论】:

  • 我明白了...所以现在的问题是,我的模型甚至不能用作数据库。我必须改变什么?我的意思是必须有办法做到这一点。例如:一个男人可以和一个女人结婚。但是一个男人也存在,当他没有结婚的时候。女人也一样。
  • 您必须确保应用程序逻辑中的约束,并在数据库中将其建模为一对多,其中一台设备可以有许多 SIM 卡(因为确实可以使用某些设备)。在婚姻的情况下,它也由法律强制执行。
  • 这在我们的设备上是不可能的 :) 所以……你说不可能在数据层实现这种情况,而我必须在应用程序逻辑中担心它?
  • 如果您使用触发器来强制唯一性,则可能在数据层上,但关系本身看起来像一对多。
猜你喜欢
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多