Ver*_*ern 5 .net linq code-contracts
我刚开始在项目中使用代码契约.但是,我的存储库实现存在问题,它使用实体框架查询我的数据库.
我有以下方法:
public IEnumerable<Organization> GetAllOrganizations()
{
return _uow.CreateSet<Party>().OfType<Organization>().AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)
该方法返回一个包含数据库中所有组织的集合,或者一个空集合,它不是数据库中的组织.
但是,根据CodeContracts,这是不行的,它给了我错误:"需要unproven:source!= null"
它试图告诉我什么?我可以通过使用Contract.Assume来满足代码契约,假设它总能找到一些东西,但是我需要在从数据库中读取数据的所有方法中都这样做.
我在这里遗漏了什么,或者当你使用数据库和LINQ时,它是否是预期的行为?
小智 2
我的猜测是,CreateSet、OfType 和 AsEnumerable 方法之一被声明为带有名为“source”的 this 参数的扩展方法,而 CodeContrcts 无法证明它不为 null。另外,您不需要添加 Requires 子句来指定 _uow 在条目上不为空吗?
CreateSet 似乎是扩展方法,因为它没有出现在 MSDN 中。如果该方法不应该返回 null,您可以通过将此约定添加到来强制执行此操作CreateSet:
Contract.Ensures(Contract.Result<T>() != null);
Run Code Online (Sandbox Code Playgroud)
当 CodeContracts 分析器看到此规则时,它将作为输入OfType不会为空的证据,并且警告应该消失。
| 归档时间: |
|
| 查看次数: |
1750 次 |
| 最近记录: |