我们可以保存对父对象的更改,但不会保留对子集合的更改。
我们使用了命名约定,允许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;
这有效,但不满意,因为保存父母不再是交易性的。还有更好的方法吗?