AsNoTracking()EF核心的意外行为

时间:2019-12-04 10:09:32

标签: c# many-to-many ef-core-2.2

我目前正在处理一个没有中间表的异常多对多关系(从技术上但从概念上来说)。
该关系如下所示:states表具有列idlocalecountryIdnamecountries表具有列{{1} },idlocale。虽然我有几种语言,但我想将州和城市存储在其中-我有几个州,它们的name相同,但id不同(这些列一起代表一个主键),它们引用同一国家。但是,由于相同的原因,该国家也有几行具有相同的locale
我尝试使用EF Core设置此关系,并且该关系有效(感谢my previous question的支持)。上下文代码如下所示:

id

我的模型(为简单起见,删除了protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<State>() .ToTable("address_state"); modelBuilder.Entity<Country>() .ToTable("address_country"); modelBuilder.Entity<Country>().HasKey(c => new {c.Id, c.Locale}); modelBuilder.Entity<State>().HasKey(s => new {s.Id, s.Locale}); modelBuilder.Entity<State>() .HasMany(a => a.CountryLocales) .WithOne() .HasForeignKey(x => x.Id) .HasPrincipalKey(x => x.CountryId); base.OnModelCreating(modelBuilder); } public DbSet<State> States { get; set; } public DbSet<Country> Countries { get; set; } ):

name

然后,我尝试以不同的语言获取充满了国家/地区集合的所有州。

public class Country
{
    public int Id { get; set; }
    public string Locale { get; set; }
}
public class State
{
    public int Id { get; set; }
    public string Locale { get; set; }
    public int CountryId { get; set; }
    public List<Country> CountryLocales { get; set; }
}

但是,这会生成一个州列表,其中只有州的第一个语言环境充满了国家。例如,在州名 Bayern 中使用语言环境名称​​ Bavaria ,我收集了一些仅以德语为该州填充的国家语言环境,而没有用其他语言填充。因此, Bayern 的国家/地区列表中有2个不同的国家( Deutschland 德国)购买的巴伐利亚空的国家/地区语言环境集合。
我希望所有州都可以使用国家/地区语言。我可以通过删除var states = context.States.AsNoTracking().Include(a => a.CountryLocales).ToList(); 方法来实现。但是,我不明白为什么它不能使用此方法。有人可以帮我澄清一下吗?
There is a sample project 分支 AsNoTracking()
谢谢!

0 个答案:

没有答案