如何在EF Code First中定义1:c关系

时间:2011-10-20 08:30:01

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

我有以下型号:

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中实现它?

1 个答案:

答案 0 :(得分:3)

此关系无法与EF映射,甚至在数据库中也不起作用。

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

这意味着Device表必须具有:

  • FK列到SIM卡(关系)
  • FK列必须可以为空(设备可以不存在SIM卡)
  • FK列必须具有唯一索引(SIM卡只能分配给一个设备)

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

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