子集合未保存在Entity Framework Core中

时间:2017-07-31 06:43:56

标签: entity-framework entity-framework-core

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

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

我正在测试的示例中,父级在db中有一个子实体。我们在该父级的MyChildren集合中添加了第二个子实体。为什么SaveChanges不会将对MyChildren集合的更新持久保存到db?

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;
    }
}

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;

这有效,但不满意,因为保存父母不再是交易性的。还有更好的方法吗?

0 个答案:

没有答案