Я использую базу данных Sakila Sample от MySql на сервере MySql. Диаграмма выглядит следующим образом.
Важными таблицами являются магазин , инвентарь и пленка таблицы. Между таблицами и таблицей компоновки существует отношение многие ко многим , то есть таблица инвентаризация .
Я создал базу данных в новом проекте 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}, потому что он не совместим.
Настройте основной ключ или набор совместимого внешнего ключа
свойства для этих отношений. '