2011-02-09 22 views
5

我刚开始在我的项目中使用代码合同。但是,我的存储库实现有问题,它使用实体框架查询我的数据库。.NET 4代码合同:“require unproven:source!= null”

我有以下方法:

public IEnumerable<Organization> GetAllOrganizations() 
{ 
    return _uow.CreateSet<Party>().OfType<Organization>().AsEnumerable(); 
} 

该方法返回一个包含所有组织数据库中的一个集合,或一个空的收集有没有组织在数据库中。

然而,这根据CodeContracts,这给我的错误是不行的:“需要得到证实:源= NULL”

它是什么想告诉我?我可以通过使用Contract.Assume来满足代码合同,假设它总能找到一些东西,但是我需要在所有从数据库读取数据的方法中执行此操作。

我在这里错过了什么,或者当您使用数据库和LINQ时它是否打算行为?

+0

什么是“来源”?你打电话的方法是否有合同? –

+2

是[此](http://stackoverflow.com/questions/3050279/how-to-avoid-source-null-when-using-code-contracts-and-linq-to-sql)问题的任何帮助? – adrianbanks

+0

@Anon:我不知道“源”是什么。我不知道在实体框架中的方法是否有合同,但我不这么认为。 @adrianbanks:没有抱歉,我看不出有什么可以帮助我。 – Vern

回答

2

我的猜测是CreateSet,OfType和AsEnumerable方法之一被声明为带有称为“source”的this参数的扩展方法,并且CodeContrcts无法证明它不为null。另外,您是否需要添加Requires子句来指定_uow在条目上是否为非空值?

CreateSet似乎是扩展方法,因为它不会出现在MSDN中。如果方法不应该返回null,你可以通过添加本合同CreateSet执行本:

Contract.Ensures(Contract.Result<T>() != null); 

当CodeContracts分析认为这条规则,它会把它作为证据,证明该输入OfType将不能为空,警告应该消失。

+0

这很可能是'AsEnumerable',它有一个'source!= null'的前置条件。我不确定实体框架中的方法是否有许多(任何?)契约,因此'CreateSet'和'OfType'都没有后置条件。您可能需要创建自己的包装函数。 – porges

+0

如果代码的调用者负责履行该前提条件,则只能设置前提条件。在这种情况下,似乎_owow是内部责任,而不是调用者的责任。 – koenmetsu

+0

你是对的,我需要一个Requires子句来指定_uow是非空的。但补充说,我仍然收到错误。 @Porges:我认为你对这里的AsEnumerable是正确的。我已经使用AsEnumerable进行了一些测试,并且我在这里也遇到了问题。为许多功能编写包装函数似乎是一项非常繁琐的任务 - 使用不使用代码合约的第三方API时。我将不得不重新考虑使用代码合同。 – Vern