是否有人知道如何在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");
我还试图用包括你可以看到下面的图片:
请注意,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",
我找不到任何工作示例。但当然,我只是失明。
感谢您的任何帮助。
对不起,但这不起作用。 我认为,Include(t => t.PostTags)将返回IIncludableQueriable>,因此ThenInclude将不会有p.Post属性,但只有List方法,因为列表类型将从第一个输出包括。 –
Tomino
我看不到任何问题there.please看到我的更新。 – Sampath
比你更新你的答案。请参阅我更新的问题(图片)。这是一个真实项目的截图,其中关系的定义与示例项目中的相同。 – Tomino