2016-10-28 187 views
1

是否有人知道如何在EF Core中查詢數據庫中的多對多關係,但更像是從一側進行左外連接?無法查詢多對多關係

讓我解釋一下我的意思。

Currency.cs

public class Currency 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid UID { get; set; } = Guid.NewGuid(); 

    public string ISOCode { get; set; } 

    public string Symbol { get; set; } 

    [JsonIgnore] 
    public List<RegionCurrency> RegionCurrencies { get; set; } 
} 

RegionCurrency.cs

public class RegionCurrency 
{ 
    public Guid CurrencyUID { get; set; } 

    public Guid RegionUID { get; set; } 

    [ForeignKey("CurrencyUID")] 
    public Currency Currency { get; set; } 

    [ForeignKey("RegionUID")] 
    public Region Region { get; set; } 
} 

Region.cs

public class Region 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid  UID { get; set; } = Guid.NewGuid(); 

    [StringLength(8)] 
    public string CountryISOCode   { get; set; } 

    public List<RegionCurrency> RegionCurrencies { get; set; } 
} 

MyContext.cs

public class LookupTablesContext : DbContext 
{ 
    public virtual DbSet<Currency> Currecies { get; set; } 

    public virtual DbSet<RegionCurrency> RegionCurrency { get; set; } 

    public virtual DbSet<Region> Regions { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.HasDefaultSchema(SchemaName); 

     modelBuilder.Entity<RegionCurrency>() 
      .HasKey(t => new { t.CurrencyUID, t.RegionUID }) 
      .HasName("PK_RegionCurrency"); 

     modelBuilder.Entity<RegionCurrency>() 
      .HasOne(pt => pt.Region) 
      .WithMany(p => p.RegionCurrencies) 
      .HasForeignKey(pt => pt.RegionUID); 

     modelBuilder.Entity<RegionCurrency>() 
      .HasOne(pt => pt.Currency) 
      .WithMany(p => p.RegionCurrencies) 
      .HasForeignKey(pt => pt.CurrencyUID); 

     modelBuilder.Entity<Currency>() 
      .HasIndex(c => c.ISOCode) 
      .HasName("UX_Currency_ISOCode") 
      .IsUnique(); 

     modelBuilder.Entity<Region>() 
      .HasIndex(c => c.CountryISOCode) 
      .HasName("UX_Region_CountryISOCode") 
      .IsUnique(); 
    } 
} 

我的查詢:

var result = ctx.Currencies 
        .Include(c => c.RegionCurrencies) 
        .ThenInclude(rc => rc.Select(rcs => rcs.Regions)) // This seems to be wrong 
      .SingleOrDefault(c => c.ISOCode == "EUR"); 

我還試圖用包括你可以看到下面的圖片:

many-to-many relationship include

請注意,RegionCurrencies表可以包含0-N的關係,我即使在RegionCurrency表中沒有記錄,也希望獲得貨幣實體。

這(以及類似的嘗試)結束了在例外是這樣的:

類型「System.ArgumentException」的異常出現在Microsoft.EntityFrameworkCore.dll但在用戶代碼中沒有處理

更多信息:屬性表達式'rc => {來自RegionCurrency rc in rcs select [pts] .Regions}'無效。表達式應該表示一個屬性訪問:'t => t.MyProperty'。有關包括相關數據的更多信息,請參閱http://go.microsoft.com/fwlink/?LinkID=746393

Dependencies: 
"Microsoft.EntityFrameworkCore": "1.0.1", 
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.1", 

我找不到任何工作示例。但當然,我只是失明。

感謝您的任何幫助。

回答

2

你可以這樣做,如下所示。

var tag = ctx.Tags.Include(t => t.PostTags) 
      .ThenInclude(p => p.Post).FirstOrDefault(d => d.TagId == "2"); 

var posts = tag.PostTags.Select(c => c.Post).ToList(); 

注:有時VS沒有顯示智能感知正常。所以要小心intellisense:D。一種解決方案可能是:關閉VS並啓動一個新的實例。

例如:智能感知工作正常此.Include(t => t.PostTags)。但在這個.ThenInclude(p => p.Post)。你要小心將它寫不依靠智能感知。希望微軟將在未來版本的VS上解決這個問題。

結果:值的tag

:的posts

enter image description here

值:

enter image description here

測試數據:

enter image description here

enter image description here

enter image description here

更新:

這是working.Please看到的代碼。

var currency = db.Currecies.Include(t => t.RegionCurrencies) 
          .ThenInclude(p => p.Region) 
          .FirstOrDefault(t => t.UID == Guid.Parse("0f8fad5b-d9cb-469f-a165-70867728950e")); 

var regions = currency.RegionCurrencies.Select(c => c.Region).ToList(); 

結果:值的currency

:的regions

enter image description here

值:

enter image description here

Git回購:EfCoreManyToMany

+1

對不起,但這不起作用。 我認爲,Include(t => t.PostTags)將返回IIncludableQueriable >,因此ThenInclude將不會有p.Post屬性,但只有List方法,因爲列表類型將從第一個輸出包括。 – Tomino

+0

我看不到任何問題there.please看到我的更新。 – Sampath

+0

比你更新你的答案。請參閱我更新的問題(圖片)。這是一個真實項目的截圖,其中關係的定義與示例項目中的相同。 – Tomino