Как я могу определить отношение 1: c в EF Code First? - PullRequest
0 голосов
/ 20 октября 2011

У меня есть следующие модели:

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) сим-карты.Следовательно, отношение 1: c.Как я могу реализовать это в EF Code First?

1 Ответ

3 голосов
/ 20 октября 2011

Это отношение не может быть отображено с EF, и оно даже не работает в базе данных.

Вы говорите, что SIM-корзина может существовать без устройства. Это нормально, но вы также говорите, что устройство может существовать без SIM-карты, и вы все еще хотите ссылочную целостность и взаимно-однозначное отношение. Что это значит?

Это означает, что таблица устройств должна иметь:

  • FK столбец к SIM-карте (отношение)
  • Столбец FK должен иметь значение NULL (устройство может существовать без SIM-карты)
  • Столбец FK должен иметь уникальный индекс (сим-карту можно назначить только одному устройству)

Первая проблема в базе данных. Если вы поместите уникальный индекс в обнуляемый столбец, вы получите неожиданный результат - нулевое значение рассматривается как значение, и только одной записи может быть назначено нулевое значение, иначе это нарушит уникальное ограничение =>, что означает, что вы можете иметь только одно устройство без сим-карты.

Вторая проблема в EF. EF не поддерживает уникальные ключи, поэтому не видит отношения один-к-одному (и не будет создавать для вас индекс). Единственная возможность использовать реальное взаимно-однозначное отношение в EF - это поместить FK на PK устройства = устройство будет иметь то же значение PK, что и SIM-карта, но в этом случае вы не можете иметь устройство без SIM-карты.

...