我有以下型号:
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中实现它?
答案 0 :(得分:3)
此关系无法与EF映射,甚至在数据库中也不起作用。
你说SIM卡可以在没有设备的情况下存在。没关系,但你也说设备可以在没有SIM卡的情况下存在,你仍然需要参照完整性和一对一的关系。这是什么意思?
这意味着Device表必须具有:
第一个问题出在数据库中。如果您将唯一索引放置到可为空的列,您将得到一些惊讶的结果 - null被视为值,并且只有单个记录可以指定null,否则它将违反唯一约束=>这意味着你只能有一台没有SIM卡的设备。
第二个问题在于EF。 EF不支持唯一键,因此它不会看到一对一的关系(并且它不会为您创建索引)。在EF中使用真正的一对一关系的唯一可能性是将FK置于设备的PK =设备上将具有与SIM相同的PK值,但在这种情况下,您不能拥有没有SIM卡的设备。