4

產品之間的關係客戶是多對多(從設計角度來看)的關係。 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(); 

VS2017 - debug

但是,如果我明確要求以包括()的ProductCustomer實體,該實體framwork,不僅包括所有遞歸引用,還包括產品對象,而不包括客戶

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

vs 2017-debug

第一件事:我不明白爲什麼它包括對象 的整個鏈條,如果我而言,就要爲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"); 
     }); 
    } 
+0

EF Core中還沒有多對多的關係。我認爲你的意思是兩個一對多的關係。 –

+0

當然可以。產品 - 從設計角度看,客戶是多對多的關係。但它被模擬爲與第三個實體「ProductCustomer」 – alessalessio

回答

6

基本上答案由以下提示加載相關數據提供 - 該EF核心documentation的預先加載部(亮點是我的):

實體框架核心將自動修復navigati將屬性添加到先前加載到上下文實例中的任何其他實體。 因此,即使您沒有明確包含導航屬性的數據,如果先前加載了一些或所有相關實體,該屬性仍可能會填充

+0

的兩個一對多關係是的,你是對的!非常感謝 – alessalessio