更新 n:n 关系中的外键 - Entity Framework Code First Migrations
Update foreign keys in an n:n relationship - Entity Framework Code First Migrations
我正在使用 Entity Framework 代码优先迁移。 Profile
和Languages
之间存在n:n关系(一个Profile
可以有多个Languages
)。我想知道如果我有语言 ID(外键),如何更新配置文件的语言列表。对于 1:1 关系(即如果 Profile 只能有一种语言),我可以只更新 LanguageID 但是对于 n:n 我没有要更新的 LanguageID 列表所以这意味着我必须做一个额外访问数据库以检索语言并初始化配置文件对象的语言 属性。有什么办法可以解决这个问题吗?
既然你给这个迁移命名了,我假设你想做某种播种?我将从这个答案开始,以便我们讨论一些代码:
protected override void Seed(ApplicationContext context)
{
var languageIds = new List<int> {1,2,3,4}; // FK to language. Are you assigning same list to all profiles?
var profiles = context.Profiles.Include(p => p.Languages).ToList();
foreach (var profile in profiles)
{
// Since you mention updating, you may need to remove old languages
if (profiles.Languages.Any())
{ delete children... }
// add new languages. You could add a test so you only seed when no languages are present
foreach (var languageId in LanguageIds)
{
profile.Add(new Language {LanguageId = languageId};
}
}
context.SaveChanges();
}
我正在使用 Entity Framework 代码优先迁移。 Profile
和Languages
之间存在n:n关系(一个Profile
可以有多个Languages
)。我想知道如果我有语言 ID(外键),如何更新配置文件的语言列表。对于 1:1 关系(即如果 Profile 只能有一种语言),我可以只更新 LanguageID 但是对于 n:n 我没有要更新的 LanguageID 列表所以这意味着我必须做一个额外访问数据库以检索语言并初始化配置文件对象的语言 属性。有什么办法可以解决这个问题吗?
既然你给这个迁移命名了,我假设你想做某种播种?我将从这个答案开始,以便我们讨论一些代码:
protected override void Seed(ApplicationContext context)
{
var languageIds = new List<int> {1,2,3,4}; // FK to language. Are you assigning same list to all profiles?
var profiles = context.Profiles.Include(p => p.Languages).ToList();
foreach (var profile in profiles)
{
// Since you mention updating, you may need to remove old languages
if (profiles.Languages.Any())
{ delete children... }
// add new languages. You could add a test so you only seed when no languages are present
foreach (var languageId in LanguageIds)
{
profile.Add(new Language {LanguageId = languageId};
}
}
context.SaveChanges();
}