Unit testing 实体框架(POCO)和#x2B;单元测试=集合被修改异常
我有一个使用EF POCO访问数据的应用程序。一切都很好,但是单元测试有一个问题。想象两个相关的类: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; } } 这是从哪里来的?据我所知,环境完全相同(我已经开始实际进行单元测
public class Brother
{
public virtual Sister Sister { get; set; }
}
public class Sister
{
public virtual ICollection<Brother> Brothers { get; set; }
}
这是从哪里来的?据我所知,环境完全相同(我已经开始实际进行单元测试,项目使用相同的数据库、相同的用户、相同的一切)
为什么EF不能在单元测试项目中处理对象图?为什么它只在单元测试中失败?。。我完全困惑不解
- 请注意,没有提及集合的用户代码-异常必须来自EF代码
*似乎更安全的级联删除方法是先删除子对象(兄弟),然后清除父对象(姐妹对象)的集合,然后才从上下文中删除它,因为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);
}