我们刚刚完成了从EF6到EF7的合并,因为我们在应用程序中使用了ASP.Net 5。这个项目刚刚开始,所以我们不会遇到依赖测试库发布代码的问题。
我们遇到了级联插入的问题。通过级联插入,我的意思是随父实体一起插入/更新子实体的集合。它似乎以一种令人惊讶的方式依赖于操作的顺序。
给定以下定义:
public class ParentEntity
{
public int Id { get; set; }
public ICollection<ChildEntity> Children { get; set; }
}
public class ChildEntity
{
public int Id { get;set; }
public ParentEntity Parent { get; set; }
}下面的代码可以工作(ChildTable填充了3个值):
var parent = new ParentEntity();
parentSet.Add(parent);
parent.Children = new List<ChildEntity>();
for (int i = 0; i < 3; i++)
{
var child= new ChildEntity { Parent = parent };
parent.Children.Add(child);
}
_uow.SaveChanges();但以下代码不会(ChildTable保持为空):
var parent = new ParentEntity();
// Moved parentSet.Add()
parent.Children = new List<ChildEntity>();
for (int i = 0; i < 3; i++)
{
var child= new ChildEntity { Parent = parent };
parent.Children.Add(child);
}
parentSet.Add(parent);
_uow.SaveChanges();要使下面的代码正常工作,我必须执行以下操作:
var parent = new ParentEntity();
parent.Children = new List<ChildEntity>();
for (int i = 0; i < 3; i++)
{
var child= new ChildEntity { Parent = parent };
parent.Children.Add(child);
childSet.Add(child); // Added childSet.Add()
}
parentSet.Add(parent);
_uow.SaveChanges();有没有人能解释一下为什么会有这样的差异?在EF6中,这正如我所期望的那样工作。如果EF7中还没有对自动跟踪子实体的支持,我可以理解,但是很明显,如果您移动Set.Add调用,就可以让它工作。更让我惊讶的是,将Set.Add调用移到何时填充子集合是有效的。
有什么想法/解释吗?
我们使用EF7 beta 7。
发布于 2015-09-10 23:57:11
我们正在积极地工作,以使这一行为符合预期。有关我们的最新想法,请参阅我们的August 27, 2015 Design Meeting Notes。
https://stackoverflow.com/questions/32496087
复制相似问题