实体框架(POCO)+单元测试=集合被修改了异常

时间:2010-10-06 06:32:43

标签: unit-testing entity-framework collections

我有一个使用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不能处理单元测试项目中的对象图?为什么它只能在单元测试中失败?我完全不解。

  • 请注意,没有用户代码提及集合 - 例外情况必须来自EF代码吗?..

编辑:经过调查: *如果集合至少为1-many(编辑代码),则会发生这种情况 *似乎更安全的级联删除方式是首先删除子对象(Brothers),然后清除父级(Sister)的集合,然后才将其从上下文中删除,因为EF本身内部存在某些内容尝试连接实体并从其他东西中删除东西。这个问题现在已经解决了。

2 个答案:

答案 0 :(得分:0)

正如其他人所说的单元测试不能测试EF,应该让它继续测试业务规则。你能提供更多关于你想做什么的信息,我们可以帮助你。

答案 1 :(得分:0)

经过调查:*如果集合至少为1-many(编辑代码),则会发生这种情况*似乎更安全的级联删除方式是首先删除子对象(Brothers),然后清除集合父级(姐妹)之后只有在上下文中删除它,因为EF本身内部有一些东西试图连接实体并从其他东西中删除东西。这个问题现在已经解决了。

同样,这是(或者是)EF中的一个错误。我只是找不到Connect问题的链接,但它就在那里。因此,作为任何人的解决方案 - 只需尝试在删除之前手动断开对象图。那应该没问题。