Unit testing 实体框架(POCO)和#x2B;单元测试=集合被修改异常

Unit testing 实体框架(POCO)和#x2B;单元测试=集合被修改异常,unit-testing,entity-framework,collections,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; } } 这是从哪里来的?据我所知,环境完全相同(我已经开始实际进行单元测

我有一个使用EF POCO访问数据的应用程序。一切都很好,但是单元测试有一个问题。想象两个相关的类:

public class Brother
{
    public virtual Sister Sister { get; set; }
}

public class Sister
{
    public virtual ICollection<Brother> Brothers { get; set; }
}
这是从哪里来的?据我所知,环境完全相同(我已经开始实际进行单元测试,项目使用相同的数据库、相同的用户、相同的一切)

为什么EF不能在单元测试项目中处理对象图?为什么它只在单元测试中失败?。。我完全困惑不解

  • 请注意,没有提及集合的用户代码-异常必须来自EF代码
编辑:调查后: *如果集合至少为1个(编辑代码),则会发生这种情况
*似乎更安全的级联删除方法是先删除子对象(兄弟),然后清除父对象(姐妹对象)的集合,然后才从上下文中删除它,因为EF本身内部有一些东西试图连接实体并从其他东西中删除内容。这个问题现在已经为我解决了。

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

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


同样,这是(或是)EF中的一个bug。我只是找不到连接问题的链接,但它就在那里。因此,作为一个解决方案,任何人只要尝试手动断开对象图删除之前。然后就可以了。

查看这篇文章:请注意问题的最后一点-没有提到集合的用户代码。这段代码可能不能代表您的实际单元测试,但如果是,您需要考虑在这些测试中尝试实现什么。正如这段代码所示,你只是在测试EF,这不是你的责任,MS已经做到了。这段代码肯定只是测试的一部分——我并不是在测试这个失败的函数,而是实际测试方法的一部分,我只是需要在测试过程中创建和删除对象。再次,这是EF的一个问题。以上代码不是完整的测试代码。这只是测试设置的一部分。
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);
}