Вложенные объединения Entity Framework - PullRequest
1 голос
/ 23 марта 2019

Я новичок в структуре сущностей и с трудом пытаюсь понять, как сделать запрос с объединением, когда мои модели выглядят так (резко упрощено)

class Customer
{
    public int Id {get; set;}

    public Vehicles Vehicles {get; set;}   
}

class Vehicles
{
    public List<Vehicle> Items {get; set;}
}

class Vehicle
{
    public int Id {get; set;}

    public int CustomerId {get; set;}
}

Если я поставлю List<Vehicle> по классу клиентов напрямую.Я могу сделать беглое отображение как это

builder.Entity<Customer>()
    .HasMany(x => x.Items)
    .WithOne()
    .HasForeignKey(x => x.CustomerId);

Что тогда я могу сделать это, и я получаю объект клиента с транспортными средствами

db.Customers.Include(x => x.Items).FirstOrDefault(x => x.Id == 1);

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

builder.Entity<Customer>(t =>
{
    t.OwnsOne(x => x.Vehicles, v =>
    {
        v.HasMany(x => x.Items).WithOne().HasForeignKey(x => x.CustomerId);
    });
});

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Можно отобразить исходные классы, но совершенно нелогичным способом.

Поскольку класс Vehicles является просто контейнером, отображение его как принадлежащего объекту, как вы пытались, кажется наиболее естественным способом.Однако в настоящее время EF Core не позволяет принадлежащему объекту быть на главной стороне отношений, и в вашем случае это необходимо.

Таким образом, вместо этого вам нужно отобразить класс Vehicles как обычную "сущность", разделяющую ту же таблицу с Customer - так называемое разбиение таблицы .Вы должны сделать все, что EF Core делает неявным образом для принадлежащих объектов, - определите свойство shadow , а map - это и PK, и FK для отношения один-к-одному с Customer.Вам также необходимо явно отобразить Vehicle.CustomerId как FK, поскольку с точки зрения EF Vehicle относится к Vehicles, а не к Custome, следовательно, предполагаемое имя свойства / столбца обычного FK будет VehiclesId.Обратите внимание, что с этой моделью вы никогда не сможете определить свойство обратной навигации Customer из Vehicle.

С учетом сказанного, здесь необходима свободная конфигурация:

modelBuilder.Entity<Vehicles>(builder =>
{
    // Table
    builder.ToTable(modelBuilder.Entity<Customer>().Metadata.Relational().TableName);
    // PK
    builder.Property<int>("Id");
    builder.HasKey("Id");
    // One-to-one relationship with Customer
    builder.HasOne<Customer>()
        .WithOne(e => e.Vehicles)
        .HasForeignKey<Vehicles>("Id");
    // One-to-many relationship with Vehicle
    builder.HasMany(e => e.Items)
        .WithOne()
        .HasForeignKey(e => e.CustomerId);
});

и использование:

db.Customers
    .Include(x => x.Vehicles.Items) // <--
    // ...
0 голосов
/ 23 марта 2019

Использование .Join

См. Этот вопрос для некоторых примеров:

Entity Framework объединяет 3 таблицы

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