EntityFramework Core 2: сопоставление один ко многим с использованием отфильтрованного списка - PullRequest
0 голосов
/ 09 мая 2019

У меня есть объекты, которые выглядят так:

class Parent1
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Child> Children { get; set; }
}

class Parent2
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Child> Children { get; set; }

}


class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string ParentType { get; set; }
    public int ParentId { get; set; }
}

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

когда я использую entity.HasMany(d => d.Children), я не вижу способа сопоставить его с ParentType = "Parent1" и ParentId = d.Id

возможно ли это даже в EFCore 2.X

Обновление 1:

У меня есть ограничение, что я не могу изменить дизайн моей таблицы, который выглядит так на child_table

------------------------------------------------
| Id   |  Name  | Parent_Type  |  Parent_Id    |       
------------------------------------------------
|  1   | C1     | Parent1      | 1             |
|  2   | C2     | Parent2      | 1             |
|  2   | C3     | Parent2      | 1             |
|  2   | C4     | Parent1      | 1             |
|  2   | C5     | Parent2      | 1             |
------------------------------------------------

1 Ответ

0 голосов
/ 09 мая 2019

Вы должны добавить обе родительские сущности в дочернюю сущность и сделать внешние ключи обнуляемыми.

Настройте свою модель ребенка так, чтобы она выглядела так

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Parent1 Parent1 { get; set; }
    public int? ParentId1 { get; set; }
    public Parent2 Parent2 { get; set; }
    public int? ParentId2 { get; set; }
}

В вас DbContext в методе OnModelCreating(ModelBuilder modelBuilder) выполните следующее

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Parent1>()
        .HasMany(p => p.Children)
        .WithOne(c => c.Parent1)
        .HasForeignKey(c => c.ParentId1);

    modelBuilder.Entity<Parent2>()
        .HasMany(p => p.Children)
        .WithOne(c => c.Parent2)
        .HasForeignKey(c => c.ParentId2);

    modelBuilder.Entity<Child>();
    // more configuration
}

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

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

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