2016-10-26 3 views
1

Я создаю приложение MVC и хочу сгенерировать базу данных с использованием подхода Code First. Я сделал это с помощью простых таблиц, но теперь, когда я вводил отношения с внешним ключом, вещи меня путают.Назначение внешних ключей с использованием кода

У меня есть три класса, каждый из которых будет иметь свою собственную таблицу в базе данных:

public class Device 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int InternalDeviceID { get; set; } 

     public int DeviceID { get; set; } 

     public string DeviceName { get; set; } 

     public virtual EquipmentDevice EquipmentDevice { get; set; } 
    } 

public class Equipment 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int InternalEquipmentID { get; set; } 

     public int EquipmentID { get; set; } 

     public string EquipmentName { get; set; } 

     public virtual EquipmentDevice EquipmentDevice { get; set; } 
    } 

public class EquipmentDevice 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int InternalEquipmentDeviceID { get; set; } 

     public virtual ICollection<Equipment> EquipmentID { get; set; } 

     public virtual ICollection<Device> DeviceID { get; set; } 
    } 

Отношение в том, что оборудование может иметь множество устройств и устройства могут принадлежать многим оборудованиям (а многим для многих, если я не ошибаюсь). Чтобы организовать оборудование, с которыми связаны устройства, я использую таблицу EquipmentDevice, которая будет просто связывать их идентификаторы вместе с внутренним идентификатором для этой таблицы.

Основываясь на других примерах, которые я нашел, я считал, что это способ кодирования такой ситуации, когда многие стороны отношений будут иметь объект ICollection <> с одной стороны, а Single сторона отношения будет иметь виртуальный объект со стороны Many (оба класса имеют ICollection <> другого для N: N или оба имеют виртуальный для 1: 1)

Однако, когда я создаю базы данных, мои таблицы выглядеть следующим образом:

Таблица устройствоenter image description here

оборудование Стол enter image description here

EquipmentDevice Таблица

enter image description here

Могу ли я просто в обратном пути, в котором я настройка внешних ключей для моих таблиц, или есть другая проблема Я вообще отсутствую для такого рода ситуаций? Я не мог найти исключительно полезный источник информации по этому вопросу. Я также присоединяю то, как будет выглядеть диаграмма этих таблиц, просто чтобы помочь быть более ясными.

enter image description here

ответ

1

Вы близко распо свойства на оборудование и устройства должны быть ICollections. Вам не нужно определять класс для таблицы соединений, EF позаботится об этом для вас. Вот то, что ваши классы должны выглядеть (вот хорошая ссылка :)

http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

public class Device 
      { 
       public Device() 
       { this.Equipments = new HashSet<Equipment>();} 

       [Key] 
       [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
       public int InternalDeviceID { get; set; } 

       public int DeviceID { get; set; } 

       public string DeviceName { get; set; } 

       public virtual ICollection<Equipment> Equipments { get; set; } 
      } 

    public class Equipment 
     { 

      public Equipment() 
      { this.Devices = new HashSet<Device>(); } 

      [Key] 
      [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
      public int InternalEquipmentID { get; set; } 

      public int EquipmentID { get; set; } 

      public string EquipmentName { get; set; } 

      public virtual ICollection<Devices> Devices { get; set; } 
     } 
+0

Ах очень приятно - я не знал, что EF создаст реляционные таблицы для вас! Хотя, возможно, вы могли бы подробнее остановиться на «общедоступном оборудовании() ... HashSet» и «public Device() ... HashSet» часть класса? Я не думаю, что натолкнулся на то, что в моих примерах пока –

+1

EF использует объекты HashSet для представления свойств коллекции по обе стороны от отношения «многие ко многим». Вы должны «обновить» их в конструкторе, чтобы их можно было заполнить из базы данных или в памяти, иначе вы получите исключение NullReferenceException при загрузке БД или когда вы попытаетесь работать с одной из коллекций для операции CRUD. –

+0

Итак, скажем, что у меня есть Table_A и Table_B. Они имеют отношение 1: N, соответственно. Я хочу использовать ID из таблицы_A как FK в таблице_B, но не нужно никаких столбцов из таблицы_B, чтобы присутствовать в таблице_A. Поскольку я не создаю новую таблицу из этих отношений, будет ли Table_A иметь только свойство «public virtual Table_B objectname», а у Table_B есть свойство «public virtual ICollection objectname», и что будет иметь внешний ключ от A до B? –

1

Для создания внешних ключей, то первое, что нужно сделать, это создать модели.

public class Device 
{ 
    [Key] 
    public int DeviceID { get; set; } 
    public string DeviceName { get; set; } 

    public virtual ICollection<Equipment> Equipments { get; set; } 
} 

public class Equipment 
{   
    [Key] 
    public int EquipmentID { get; set; } 
    public string EquipmentName { get; set; } 

    public virtual ICollection<Device> Devices { get; set; } 
} 

Затем вы создаете и скомпилируете драйвер для каждой из моделей. Создавая первую модель, создается «Контекст».

enter image description here

После загрузки проекта и проверить, если у вас есть доступ к драйверам созданных.

enter image description here

Теперь проверяет базу данных. В таблице автоматически создается два внешних ключа в новой таблице.

+0

В чем разница в использовании [Key] и [ForeignKey (имя строки)]? –

+0

Ключ - это первичный ключ. Вы назначаете иностранный ключ cuando utilizas –

+0

«[Key]» является основным ключом. Внешний ключ присваивается с использованием моделей ICollection Device and Equipment. –