如何使用跳过导航属性更新多对多关系

问题描述 投票:0回答:1

我正在使用 .NET 6 版本和 EF Core 7。 我定义了两个实体:

public class Country
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Language> Languages { get; set; }
}

// One language -> Many Countries
public class Language
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Country> Countries { get; set; }
}

我的数据库上下文有多对多关系定义:

modelBuilder.Entity<Country>
                      .HasMany(_ => _.Languages)
                      .WithMany(_ => _.Countries);

在底层,EF Core 创建链接表 CountryLanguage。 例如,我有一个 ID = 1 的国家/地区和 ID 为:1, 2,3 的语言,并且可以说 ID 为 1 的国家/地区当前链接到 ID 为 1 的语言。这意味着表 CountryLanguage 有一行 CountryId = 1 且 LanguageId = 1.

现在我想更改它,ID = 1 的国家/地区将链接到 ID 为:2 和 3 的语言。 但是当我尝试使用 DbSet for Country 的 Update 方法时,它会添加新链接,但上一个链接不会被删除,结果 我得到 ID=1 的国家/地区,它链接到 ID 为:1、2 和 3 的语言。 这意味着表 CountryLanguage 现在有三行,其中 CountryId = 1 和 LanguageId =1、CountryId = 1 和 LanguageId =2 以及 CountryId = 1 且 LanguageId =3。

期望的行为是获取 ID=1 的国家/地区,该国家/地区仅链接到 ID 为 2 和 3 的语言。 请帮我弄清楚该怎么做。 谢谢你。

c# asp.net .net entity-framework ef-core-7.0
1个回答
0
投票

您可以与我们分享您的代码吗?

看起来您只是将新项目添加到

Country.Languages
。要删除现有关系,您需要手动执行此操作。例如:
_dbContext.Languages.Remove(languageItemToRemove);

最后,别忘了使用

_dbContext.SaveChanges();

© www.soinside.com 2019 - 2024. All rights reserved.