2016-10-28 207 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