Entity Framework Core: отношение «многие ко многим» между таблицами общих объектов - PullRequest
0 голосов
/ 01 июня 2018

У меня есть таблица Cat и Dog, и я хочу создать отношения «многие ко многим» с таблицей изображений.Я не хочу создавать таблицу соединений для каждой таблицы (DogImage, CatImage, BirdImage и т. Д.), Поэтому я решил, что создам одну таблицу соединений EntityImage, а затем использую поле Тип, чтобы узнать, какой это тип изображения.Вот моя попытка использовать приведенную ниже модель, однако она создает внешние ключи CatId, DogId и т. Д. В таблице EntityImage вместо использования EntityId, который я пытался определить.Кто-нибудь знает, как правильно справиться с этим с помощью последней версии Entity Framework Core?Спасибо!

public class Cat
{
    [Key] public int CatId { get; set; }
    public string CatName { get; set; }
    public ICollection<EntityFile> Files { get; } = new List<EntityFile>();
}

public class Dog
{
    [Key] public int DogId{ get; set; }
    public string DogName { get; set; }
    public ICollection<EntityImage> Images { get; } = new List<EntityImage>();
}

public class Image
{
    [Key] public int ImageId { get; set; }
    public string ImageName{ get; set; }
    public Byte[] Content { get; set; }
}

public class EntityImage
{
    public int EntityId { get; set; }
    public int ImageId { get; set; }
    public int ImageType { get; set; }
    public Image Image { get; set; }
}

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<EntityImage>().ToTable("EntityImage").HasKey(t => new { t.EntityId, t.ImageId });
}

1 Ответ

0 голосов
/ 01 июня 2018

EF Core пока не имеет какой-то более сложной обработки отношений (например, иерархической).

В вашем конкретном примере вы можете просто использовать

public class Animal {
    public string Name {get; set;}
    public byte[] Image {get; set;}
}

public class Cat : Animal {
    public int Id {get; set;}
}

public class Dog : Animal {
    public int Id {get; set;}
}

В EF 6,Вы могли бы иметь Animal, Dog & Cat все пойти на разные столы.EF установит для вас ключи и поля навигации.Тип объекта (Dog / Cat) будет контролировать, какие записи в Animal вы увидите.Обратите внимание, что это специализированный случай отношения один-к-одному (иерархический).

Вы упомянули много ко многим, но я нахожу маловероятным, что два животных имеют одно и то же изображение, и если дублирование имени по всемуразновидность - это проблема, переместите Name в производные классы (Dog / Cat).

В какой-то момент EF Core, вероятно, сделает это, я просто еще не видел (DataAnnotation / Fluent).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...