我目前正在处理一个没有中间表的异常多对多关系(从技术上但从概念上来说)。
该关系如下所示:states
表具有列id
,locale
,countryId
,name
和countries
表具有列{{1} },id
,locale
。虽然我有几种语言,但我想将州和城市存储在其中-我有几个州,它们的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()
。
谢谢!