gpt4 book ai didi

c# - 多对多关系中的 EF Core Include()

转载 作者:太空狗 更新时间:2023-10-30 00:48:48 26 4
gpt4 key购买 nike

ProductCustomer 之间的关系是多对多类型的(从设计的角度来看)。

使用 EF Core,我们将此关系拆分为两个与第三方实体的一对多关系:ProductCustomer

public partial class ProductCustomer
{
public long ProductId { get; set; }
public long CustomerId { get; set; }
public virtual Customer Customer { get; set; }
public virtual Product Product { get; set; }

public virtual ICollection<UsageRecord> UsageRecord { get; set; }
}

UsageRecord 是包含特定客户在使用产品时使用的数据量的记录列表

public partial class UsageRecord
{
public long Id { get; set; }
public long ProductId { get; set; }
public long CustomerId { get; set; }
public decimal Quantity { get; set; }
public virtual ProductCustomer ProductCustomer { get; set; }
}

现在,如果我尝试读取特定的 UsageRecordProductCustomer 对象为 null(完美,我正在使用预加载方法)

return _usageRecordEntity.Where(x => x.ProductId == productId).AsEnumerable();

VS2017 - debug

但是,如果我特别要求对 ProductCustomer 实体进行 Include(), Entity Framework 不仅包括所有递归引用,还包括 Product 对象而不是客户!

return _usageRecordEntity.Where(x => x.ProductId == productId).Include(p => p.ProductCustomer).AsEnumerable();

vs 2017-debug

第一件事:我不明白为什么它包括整个对象链如果我专门询问 ProductCustomer 一个。

第二件事:为什么是产品而不是客户?!


为了完整起见,我包括了 Context 模型:

 protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>(entity =>
{
entity.Property(e => e.customerId)
.IsRequired()
.HasColumnName("CustomerId")
.HasMaxLength(255);
});

modelBuilder.Entity<Product>(entity =>
{
entity.Property(e => e.Name)
.IsRequired()
.HasMaxLength(50);
});

modelBuilder.Entity<ProductCustomer>(entity =>
{
entity.HasKey(e => new { e.ProductId, e.CustomerId })
.HasName("PK__ProductCustomerComposite");

entity.HasOne(d => d.Customer)
.WithMany(p => p.ProductCustomer)
.HasForeignKey(d => d.CustomerId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK__ProductCu__CustomerId");

entity.HasOne(d => d.Product)
.WithMany(p => p.ProductCustomer)
.HasForeignKey(d => d.ProductId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK__ProductCu__ProductId");
});

modelBuilder.Entity<UsageRecord>(entity =>
{
entity.Property(e => e.Quantity)
.HasColumnType("decimal")
.HasDefaultValueSql("0");

entity.HasOne(d => d.ProductCustomer)
.WithMany(p => p.UsageRecord)
.HasForeignKey(d => new { d.ProductId, d.CustomerId })
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_UsageRecordProductcustomer");
});
}

最佳答案

基本上,EF Core documentation加载相关数据 - 预先加载部分中的以下提示提供了答案。 (突出显示是我的):

Entity Framework Core will automatically fix-up navigation properties to any other entities that were previously loaded into the context instance. So even if you don't explicitly include the data for a navigation property, the property may still be populated if some or all of the related entities were previously loaded.

关于c# - 多对多关系中的 EF Core Include(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43374526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com