Entity framework 实体框架嵌套联接

Entity framework 实体框架嵌套联接,entity-framework,.net-core,Entity Framework,.net Core,我是实体框架的新手,当我的模型看起来像这样(大大简化)时,我很难想出如何使用连接进行查询 我不明白的是如何使用我的原始模型集来实现这一点。如果可能的话,我想保持现状。我在我的onModelCreating方法中尝试过各种版本的这项工作,但运气不佳 builder.Entity<Customer>(t => { t.OwnsOne(x => x.Vehicles, v => { v.HasMany(x => x.Items).Wi

我是实体框架的新手,当我的模型看起来像这样(大大简化)时,我很难想出如何使用连接进行查询

我不明白的是如何使用我的原始模型集来实现这一点。如果可能的话,我想保持现状。我在我的
onModelCreating
方法中尝试过各种版本的这项工作,但运气不佳

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

使用
。加入

有关一些示例,请参见此问题:


可以映射原始类,但这是一种违反直觉的方式

由于
Vehicles
类只是一个容器,所以将其映射为您尝试过的自有实体似乎是最自然的方式。然而,目前EF Core不允许拥有的实体处于关系的主要方面,在您的情况下,这是必要的

因此,您需要将
车辆
类映射为与
客户
共享同一表格的常规“实体”——即所谓的“实体”。您必须明确地执行EF Core为所属实体隐式执行的所有操作-定义一个和映射是与
客户的一对一关系的PK和FK。您还需要将
Vehicle.CustomerId
显式映射为FK,因为从EF的角度来看
Vehicle
Vehicles
相关,而不是与
Custome
相关,因此传统的FK属性/列名假定为
VehiclesId
。请注意,使用此型号,您将永远无法定义
车辆
的反向导航属性
客户

话虽如此,以下是所需的流畅配置:

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);
});
modelBuilder.Entity(builder=>
{
//桌子
ToTable(modelBuilder.Entity().Metadata.Relational().TableName);
//主键
建筑商财产(“Id”);
建造商:HasKey(“Id”);
//与客户的一对一关系
builder.HasOne()
.一辆(e=>e.Vehicles)
.HasForeignKey(“Id”);
//与车辆的一对多关系
builder.HasMany(e=>e.Items)
.WithOne()
.HasForeignKey(e=>e.CustomerId);
});
使用方法:

db.Customers
    .Include(x => x.Vehicles.Items) // <--
    // ...
db.Customers

.Include(x=>x.Vehicles.Items)//为什么要将实体车辆作为车辆列表的容器?听起来不干净。如果这是博城的样子,你应该考虑把它们转换成模型对象来保存一个表和一对一的关系。此外,您可以考虑公开或隐藏所有FK属性以使其一致。这是不寻常的模型,因此映射是有问题的,这并不奇怪。示例中定义
车辆
类别的方式(不带附加属性)毫无意义。为了尝试提供帮助,我们需要了解
车辆
类的含义-它是一个实体(如果是,它是否有自己的表或必须存储在
客户
表中)还是某种容器类?它是一个容器类。它没有自己的桌子。其中涉及的两个表是customers表和vehicles表。我试图重用此解决方案中存在的大量实体。它们并不完全代表数据库,但非常接近。我已经能够使用fluent mapping完成剩下的工作。
builder.Entity<Customer>(t =>
{
    t.OwnsOne(x => x.Vehicles, v =>
    {
        v.HasMany(x => x.Items).WithOne().HasForeignKey(x => x.CustomerId);
    });
});
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) // <--
    // ...