子集合未保存在 Entity Framework Core 中

Vag*_*gue 5 entity-framework entity-framework-core

我们能够保存对父对象的更改,但不会保留对子集合的更改。

我们使用了允许 EF Core 发现关系并正确构建数据库的命名约定。

我正在测试的示例在 db 中有一个带有单个子实体的父实体。我们已将第二个子实体添加到该父实体的 MyChildren 集合中。为什么 SaveChanges 不会将 MyChildren 集合的更新保存到数据库?

public class ParentType
{
    public Guid ParentId { get; set; }
    public string SomeString { get; set; }
    public ObservableCollection<ChildType> MyChildren { get; set; } = new ObservableCollection<ChildType>();
}

public class ChildType
{
    public Guid Child { get; set; }
    public ParentType MyParent { get; set; }
}
// in the example parentIn is passed with 2 ChildType entities in MyChildren.
public static ParentType SaveMe(ParentType parentIn)
{
    ParentType parentSaved = null;
    using (DataContext db = new DataContext())
    {
        if (parentIn.ParentId == Guid.Empty)
        {
            parentSaved = new ParentType();
            parentSaved.ParentId = Guid.NewGuid();
            db.Parents.Add(parentSaved);
        }
        else
        {
        // in the example parentIn is found in the db with 1 child entity
            parentSaved = db.Parents.Where(e => e.ParentId == parentIn.ParentId).Include(e => e.MyChildren).SingleOrDefault();
        }
        parentSaved.SomeString = parentIn.SomeString;
        parentSaved.MyChildren = parentIn.MyChildren;

        int result = db.SaveChanges();
        return parentSaved;
    }
}
Run Code Online (Sandbox Code Playgroud)

SomeString 已保存,但 MyChildren 未保存。没有错误。为什么子实体没有更新?

编辑 1作为一种解决方法,我在添加新的子集合之前从数据库中删除了子集合。

else
    {
    // in the example parentIn is found in the db with 1 child entity
        parentSaved = db.Parents.Where(e => e.ParentId == parentIn.ParentId).Include(e => e.MyChildren).SingleOrDefault();
        db.Parents.RemoveRange(parentSaved.MyChildren);
        db.SaveChanges();
    }
    parentSaved.SomeString = parentIn.SomeString;
    parentSaved.MyChildren = parentIn.MyChildren;

    int result = db.SaveChanges();
    return parentSaved;
Run Code Online (Sandbox Code Playgroud)

这有效但并不令人满意,因为保存父级不再是事务性的。有没有更好的办法?