我有一个使用EF POCO访问数据的应用。一切都很好,但单元测试有一个问题。想象一下两个相关的类:
public class Brother
{
public virtual Sister Sister { get; set; }
}
public class Sister
{
public virtual ICollection<Brother> Brothers { get; set; }
}
这里的问题是,如果我们有一个兄弟的实例,相关实体设置为其他实体,那么ObjectContext.DeleteObject()仅在单元测试项目中抛出常见的“集合被修改”(单元测试由内置VS框架)。问题does not
发生在项目本身。失败的示例代码:
public void TheTestThatFails()
{
Brother bro = MyContextInst.CreateObject<Brother>();
Sister sis = MyContextInst.CreateObject<Sister>();
sis.Brothers.Add(bro);
MyContextInst.AddToBrothers(bro);
MyContextInst.AddToSisters(sis);
MyContextInst.SaveChanges();
// The following will throw a "Collection was modified" ex
MyContextInst.DeleteObject(sis);
// Yet if we disconnect the object graph everything is fine
// The following will work fine:
bro.Sister = null;
MyContextInst.DeleteObject(sis);
}
这是从哪里来的?据我所知,环境是完全一样的(我实际上是进行单元测试,项目使用相同的DB,同一个用户,同样的一切)。
为什么EF不能处理单元测试项目中的对象图?为什么它只能在单元测试中失败?我完全不解。
编辑:经过调查: *如果集合至少为1-many(编辑代码),则会发生这种情况 *似乎更安全的级联删除方式是首先删除子对象(Brothers),然后清除父级(Sister)的集合,然后才将其从上下文中删除,因为EF本身内部存在某些内容尝试连接实体并从其他东西中删除东西。这个问题现在已经解决了。
答案 0 :(得分:0)
正如其他人所说的单元测试不能测试EF,应该让它继续测试业务规则。你能提供更多关于你想做什么的信息,我们可以帮助你。
答案 1 :(得分:0)
经过调查:*如果集合至少为1-many(编辑代码),则会发生这种情况*似乎更安全的级联删除方式是首先删除子对象(Brothers),然后清除集合父级(姐妹)之后只有在上下文中删除它,因为EF本身内部有一些东西试图连接实体并从其他东西中删除东西。这个问题现在已经解决了。
同样,这是(或者是)EF中的一个错误。我只是找不到Connect问题的链接,但它就在那里。因此,作为任何人的解决方案 - 只需尝试在删除之前手动断开对象图。那应该没问题。