在更新 Entity Framework 核心中的 parent 实体时添加或更新 child 实体
Add or Update child entities when updating a parent entity in Entity Framework Core
在一个新项目中,我们使用 Entity Framework Core 而不是 EntityFramework 6.2.0。效果很好,但在更新 parents children 的同时插入新的 children.
时会导致问题
示例:
当前型号:
public class Profile
{
public Profile()
{
Interests = new List<Interest>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public ICollection<Interest> Interests { get; set; }
}
public class Interest
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
}
在 Entity Framework 中添加或更新 children 的代码,在 EntityFramework 6.2.0
中运行良好
//Interests
//Delete children
foreach (var existingChild in dbProfile.Interests.ToList())
{
if (!profile.Interests.Any(c => c.Name == existingChild.Name))
db.Interests.Remove(existingChild);
}
//Update and Insert children
foreach (var childModel in profile.Interests)
{
var existingChild = dbProfile.Interests
.Where(c => c.Name == childModel.Name)
.SingleOrDefault();
if (existingChild != null)
{
// Update child
childModel.Id = existingChild.Id;
db.Entry(existingChild).CurrentValues.SetValues(childModel);
}
else
{
// Insert child
var newChild = new Interest
{
Name = childModel.Name,
};
dbProfile.Interests.Add(newChild);
}
}
代码基于此答案:
使用 Microsoft.EntityFrameworkCore 2.2.6
时会发生这种情况:
按预期添加了 Id 0
的新兴趣。
但是如果发生更新,下面的代码是运行:
db.Entry(existingChild).CurrentValues.SetValues(childModel);
每个 Id 0
的新 object 都将其 Id
设置为 -2147482197
。即使没有为 parent object 设置任何内容,也会发生这种情况,只有一个 child object。为什么会这样? EF Core 中是否有替代上述方法的方法?
我可以通过删除 db.Entry(existingChild).CurrentValues.SetValues(childModel);
并将其替换为 childModel.Name = existingChild.Name;
来解决这个问题。但是,如果 object 有 20 个或更多属性,我不想手动将它们一一映射。
将以下 NuGets 从 2.2.6
更新到 3.1.0
然后一切开始正常工作:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
在一个新项目中,我们使用 Entity Framework Core 而不是 EntityFramework 6.2.0。效果很好,但在更新 parents children 的同时插入新的 children.
时会导致问题示例:
当前型号:
public class Profile
{
public Profile()
{
Interests = new List<Interest>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public ICollection<Interest> Interests { get; set; }
}
public class Interest
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
}
在 Entity Framework 中添加或更新 children 的代码,在 EntityFramework 6.2.0
中运行良好//Interests
//Delete children
foreach (var existingChild in dbProfile.Interests.ToList())
{
if (!profile.Interests.Any(c => c.Name == existingChild.Name))
db.Interests.Remove(existingChild);
}
//Update and Insert children
foreach (var childModel in profile.Interests)
{
var existingChild = dbProfile.Interests
.Where(c => c.Name == childModel.Name)
.SingleOrDefault();
if (existingChild != null)
{
// Update child
childModel.Id = existingChild.Id;
db.Entry(existingChild).CurrentValues.SetValues(childModel);
}
else
{
// Insert child
var newChild = new Interest
{
Name = childModel.Name,
};
dbProfile.Interests.Add(newChild);
}
}
代码基于此答案:
使用 Microsoft.EntityFrameworkCore 2.2.6
时会发生这种情况:
按预期添加了 Id 0
的新兴趣。
但是如果发生更新,下面的代码是运行:
db.Entry(existingChild).CurrentValues.SetValues(childModel);
每个 Id 0
的新 object 都将其 Id
设置为 -2147482197
。即使没有为 parent object 设置任何内容,也会发生这种情况,只有一个 child object。为什么会这样? EF Core 中是否有替代上述方法的方法?
我可以通过删除 db.Entry(existingChild).CurrentValues.SetValues(childModel);
并将其替换为 childModel.Name = existingChild.Name;
来解决这个问题。但是,如果 object 有 20 个或更多属性,我不想手动将它们一一映射。
将以下 NuGets 从 2.2.6
更新到 3.1.0
然后一切开始正常工作:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools