2011-02-09 3 views
5

방금 ​​프로젝트에서 코드 계약을 사용하기 시작했습니다. 그러나 Entity Framework를 사용하여 데이터베이스를 쿼리하는 리포지토리 구현에 문제가 있습니다..NET 4 코드 계약 : "requires unproven : source! = null"

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

방법은 데이터베이스에있는 모든 조직을 포함하는 모음 또는 데이터베이스의 조직이 아니라 빈 컬렉션을 반환 :

나는 다음과 같은 방법이있다.

그러나, 이것은 나에게 오류를 제공 CodeContracts에 따라 좋아하지 않습니다 : "검증되지 않은이 필요합니다 = null의 소스를"

것은 무엇을 말해하려고? Contract.Assume을 사용하여 코드 계약을 만족시킬 수 있습니다. 항상 뭔가를 찾을 것이라고 추측하지만 데이터베이스에서 데이터를 읽는 모든 메서드에서이를 수행해야합니다.

여기에 뭔가가 누락되었거나 데이터베이스와 LINQ로 작업 할 때 의도 된 동작입니까?

+0

"소스"란 무엇입니까? 전화를 거는 방법 중에 계약이 있습니까? –

+2

[this] (http://stackoverflow.com/questions/3050279/how-to-avoid-source-null-when-using-code-contracts-and-linq-to-sql) 도움이 필요합니까? – adrianbanks

+0

@Anon : "출처"가 무엇인지 전혀 알지 못합니다. Entity Framework에서 메서드에 대한 계약이 있는지는 잘 모르겠지만 그렇게 생각하지는 않습니다. @adrianbanks : 아, 미안하지만 어떻게 도움이되는지 모르겠다. – Vern

답변

2

내 생각 엔 CreateSet, OfType 및 AsEnumerable 메서드 중 하나가 "source"라는 this 매개 변수를 사용하여 확장 메서드로 선언되어 있고 CodeContrcts가 null이 아니라는 것을 증명할 수 없다고 생각됩니다. 또한 _uow가 입력시 null이 아니도록 지정하려면 Requires 절을 추가 할 필요가 없습니까?

CreateSet은 MSDN에 나타나지 않으므로 확장 메서드 인 것으로 보입니다. 메소드가 null를 돌려해서는 안 경우 CreateSet이 계약을 추가하여 적용 할 수 있습니다 :

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

CodeContracts 분석기는이 규칙을 볼 때, 그것은 OfType의 입력이 null 수 없음을 증거로 걸릴 것입니다, 경고는 사라져야합니다.

+0

'source! = null' 전제 조건을 가진'AsEnumerable' 가능성이 가장 높습니다. Entity Framework에서 메소드에 대한 많은 (모든?) 계약이 있는지 확실하지 않으므로'CreateSet'도'OfType'도 사후 조건을 가지고 있지 않습니다. 자체 래퍼 함수를 ​​만들어야 할 수도 있습니다. – porges

+0

코드의 호출자가 해당 전제 조건을 충족시킬 책임이있는 경우에만 전제 조건을 설정할 수 있습니다. 이 경우 발신자의 책임이 아니라 내부 책임임을 알 수 있습니다. – koenmetsu

+0

당신은 _uow가 null이 아니도록 지정하려면 Requires 절이 필요하다는 것이 옳습니다. 하지만 추가 한 후에도 오류가 계속 발생합니다. @Porges : AsEnumerable이 여기에있는 원인이라고 생각합니다. AsEnumerable을 사용하여 몇 가지 테스트를 수행했으며 여기에도 문제가 발생했습니다. 코드 계약을 사용하지 않는 타사 API를 사용할 때 많은 함수에 대한 래퍼 함수를 ​​작성하는 것은 매우 지루한 작업처럼 보입니다. 나는 코드 계약을 사용하여 다시 생각해야 할 것이다. – Vern

관련 문제