繁体   English   中英

在 Entity Framework Core 中更新父实体时添加或更新子实体

[英]Add or Update child entities when updating a parent entity in Entity Framework Core

在一个新项目中,我们使用 Entity Framework Core 而不是 EntityFramework 6.2.0。 效果很好,但在更新父子项同时插入新子项时会导致问题。

例子:

当前型号:

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 中添加或更新子项的代码,在 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);
    }
}

代码基于此答案:

https://stackoverflow.com/a/27177623/3850405

使用Microsoft.EntityFrameworkCore 2.2.6时会发生这种情况:

正如预期的那样,添加了一个Id 0新兴趣。

在此处输入图片说明

但是,如果发生更新并运行以下代码:

db.Entry(existingChild).CurrentValues.SetValues(childModel);

每个Id 0新对象的Id设置为-2147482197 即使没有为父对象设置任何内容,只有一个子对象,也会发生这种情况。 为什么会发生这种情况? 有什么东西取代了 EF Core 中的上述方法?

在此处输入图片说明

我可以通过删除db.Entry(existingChild).CurrentValues.SetValues(childModel);来解决这个问题db.Entry(existingChild).CurrentValues.SetValues(childModel); 并将其替换为childModel.Name = existingChild.Name; . 但是如果对象有 20 个或更多属性,我不想手动将它们一一映射。

在此处输入图片说明

将以下 NuGets 从2.2.6更新到3.1.0 ,然后一切开始正常工作:

Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM