產品和之間的關係客戶是多對多(從設計角度來看)的關係。 ProductCustomerEF Core Include()in many to many relation
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是使用含有數據的數量記錄的列表:
使用EF核心,我們兩個一到多的關係,與第三實體拆分這種關係有一定的客戶,而他使用的產品
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; }
}
現在,如果我嘗試讀取特定UsageRecord中, ProductCustomer對象是空(完美的,我使用的是預先加載的方法)
return _usageRecordEntity.Where(x => x.ProductId == productId).AsEnumerable();
但是,如果我明確要求以包括()的ProductCustomer實體,該實體framwork,不僅包括所有遞歸引用,還包括產品對象,而不包括客戶!
return _usageRecordEntity.Where(x => x.ProductId == productId).Include(p => p.ProductCustomer).AsEnumerable();
第一件事:我不明白爲什麼它包括對象 的整個鏈條,如果我而言,就要爲ProductCustomer一個問。
第二件事:爲什麼產品而不是客戶?!
我包括用於完整性的上下文模型:
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中還沒有多對多的關係。我認爲你的意思是兩個一對多的關係。 –
當然可以。產品 - 從設計角度看,客戶是多對多的關係。但它被模擬爲與第三個實體「ProductCustomer」 – alessalessio