"forigen key" связь в entity framework - Андрей Моряков

"forigen key" связь в entity framework

Добавлено: 28 Января 2018 в 03:31,  Категория: C#

Создаем модель используя подход CodeFirst. Первая главня таблица Category имеет свойство навигации коллекции Products. Вторая таблица зависимая таблица Food... Вот с ней мы и будем работать далее

Зависимая таблица имеет вторичный ключ CategoryId и свойство навигации Category именно благодаря вторичному ключу CategoryId, который не поддерживает значения null будет происходить каскадное удаление. Удаляя категорию, конечно-же, будет удалена и запись в таблице Food, так как она обязана ссылаться на что-либо, но то, на что она ссылалась мы удалили. Код ниже демонстрирует как создавать модель таблиц где работает каскадное удаление:

  public class Food
       {
             [Key]
             public int Id { get; set; }
             public string Name { get; set; }
             public int CategoryId { get; set; }
             [ForeignKey("CategoryId")]
             public Category Category { get; set; }
       }
 
       public class Category
       {
             [Key]
             public int Id { get; set; }
             public string Name { get; set; }
             public ICollection<FoodProduct> Products { get; set; }
             public Category()
             {
                    Products = new List<FoodProduct>();
             }
       }

Но теперь давайте "Отключим" каскадное удаление, другими словами, позволим внешнему ключу CategoryId в зависимой таблице Food содержать значения null. Верно ведь, теперь мы можем спокойно удалить запись в таблице Category на которую ссылается одна из записей в таблице Food. Код ниже показывает как это сделать:

  public class Food
       {
             [Key]
             public int Id { get; set; }
             public string Name { get; set; }
             public int? CategoryId { get; set; }
             [ForeignKey("CategoryId")]
             public Category Category { get; set; }
       }
 
       public class Category
       {
             [Key]
             public int Id { get; set; }
             public string Name { get; set; }
             public ICollection<FoodProduct> Products { get; set; }
             public Category()
             {
                    Products = new List<FoodProduct>();
             }
       }

Вообще если в C# объявить значимый тип со знаком вопроса сразу после названия типа. То он становится Nullable, то есть разрешает записывать в себя значения null, что является прирегативой ссылочных типов. Но это отдельная история.

Следующая ситуация -- это запретить удаление записей из основной таблицы Category если на эту запсь через внешний ключ ссылаются записи из зависимой таблицы, в нашем случеае таблицы Food. Чтобы это сделать в EF нужно вообще удалить внешний ключ, оставив только внешний ключ в виде ссылки на основную таблицу. Код ниже:

  public class Food
       {
             [Key]
             public int Id { get; set; }
             public string Name { get; set; }
             public Category Category { get; set; }
       }
 
       public class Category
       {
             [Key]
             public int Id { get; set; }
             public string Name { get; set; }
             public ICollection<FoodProduct> Products { get; set; }
             public Category()
             {
                    Products = new List<FoodProduct>();
             }
       }

Комментарии ()