EF Core 2 Прекращение круговой зависимости от отношений многих ко многим - PullRequest
0 голосов
/ 05 ноября 2018

Я использую базу данных Sakila Sample от MySql на сервере MySql. Диаграмма выглядит следующим образом. EERDiagram Sakila

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

Я создал базу данных в новом проекте dotnetcore, используя EFCore 2 . Я пытаюсь получить список магазинов и их список фильмов .

Объекты определены следующим образом:

магазин

public class Store
{
    public Store()
    {
        Customer = new HashSet<Customer>();
        Inventory = new HashSet<Inventory>();
        Staff = new HashSet<Staff>();
    }

    public byte StoreId { get; set; }
    public byte ManagerStaffId { get; set; }
    public short AddressId { get; set; }
    public DateTimeOffset LastUpdate { get; set; }

    public Address Address { get; set; }
    public Staff ManagerStaff { get; set; }
    public ICollection<Customer> Customer { get; set; }
    public ICollection<Inventory> Inventory { get; set; }
    public ICollection<Staff> Staff { get; set; }
}

Inventory

public partial class Inventory
    {
        public Inventory()
        {
            Rental = new HashSet<Rental>();
        }

        public int InventoryId { get; set; }
        public short FilmId { get; set; }
        public byte StoreId { get; set; }
        public DateTimeOffset LastUpdate { get; set; }

        public Film Film { get; set; }
        public Store Store { get; set; }
        public ICollection<Rental> Rental { get; set; }
    }

Фильм

public partial class Film
    {
 public Film()
 {
     FilmActor = new HashSet<FilmActor>();
     FilmCategory = new HashSet<FilmCategory>();
     Inventory = new HashSet<Inventory>();
 }

 public short FilmId { get; set; }
 public string Title { get; set; }
 public string Description { get; set; }
 public short? ReleaseYear { get; set; }
 public byte LanguageId { get; set; }
 public byte? OriginalLanguageId { get; set; }
 public byte RentalDuration { get; set; }
 public decimal RentalRate { get; set; }
 public short? Length { get; set; }
 public decimal ReplacementCost { get; set; }
 public string Rating { get; set; }
 public string SpecialFeatures { get; set; }
 public DateTimeOffset LastUpdate { get; set; }

 public Language Language { get; set; 
 public Language OriginalLanguage { get; set; }
 public ICollection<FilmActor> FilmActor { get; set; }
 public ICollection<FilmCategory> FilmCategory { get; set; }
 public ICollection<Inventory> Inventory { get; set; }

}

Мой контекст выглядит следующим образом:

  modelBuilder.Entity<Inventory>(entity =>
  {
         entity.ToTable("inventory", "sakila");

         entity.HasIndex(e => e.FilmId)
             .HasName("idx_fk_film_id");

         entity.HasIndex(e => new { e.StoreId, e.FilmId })
             .HasName("idx_store_id_film_id");

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

public IEnumerable<Store> GetStores()
{
    return _context.Store.
        Include(a => a.Inventory).
        ToList();
}

Проблема: Когда я вызываю этот метод из контроллера, чтобы получить список магазинов, я не получаю никакого json-ответа на Postman. Тем не менее, если я отлаживаю в списке, который возвращается из контроллера, я нахожу список магазинов. Проблема в том, что список содержит: хранение-> инвентарь-> фильм-> магазин-> инвентарь-> фильм-> магазин ... и т. д. Создание циклической зависимости, которая заполняет разрешенную память процесса запроса.

Возможные решения: Я думаю, что это связано с тем, что в Context оба Foreign Keys определены как HasIndex вместо HasKey

entity.HasIndex(e => new { e.StoreId, e.FilmId })
                 .HasName("idx_store_id_film_id");

Когда я определяю его как HasKey , тогда я получаю сообщение об ошибке:

'Отношение' Rental.Inventory 'к' Inventory.Rental 'с свойства внешнего ключа {'InventoryId': int} не могут быть нацелены на основной key {'StoreId': byte, 'FilmId': short}, потому что он не совместим. Настройте основной ключ или набор совместимого внешнего ключа свойства для этих отношений. '

...