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) // <--
// ...