2011-02-09 24 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