2011-02-09 21 views
5

Tôi vừa bắt đầu sử dụng các hợp đồng mã trong dự án của mình. Tuy nhiên, tôi có một vấn đề với việc triển khai kho lưu trữ của tôi, truy vấn cơ sở dữ liệu của tôi bằng cách sử dụng khung Entity..NET 4 Mã hợp đồng: "yêu cầu chưa được chứng minh: source! = Null"

tôi có phương pháp sau đây:

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

Phương pháp này trả về một bộ sưu tập bao gồm tất cả các tổ chức trong cơ sở dữ liệu, hay một bộ sưu tập sản phẩm nào đó không phải là các tổ chức trong cơ sở dữ liệu.

Tuy nhiên, điều này không ổn theo CodeContracts, trong đó cung cấp cho tôi những lỗi: "yêu cầu chưa được chứng minh: nguồn = null"

gì là nó cố gắng để cho tôi biết? Tôi có thể thỏa mãn các hợp đồng mã bằng cách sử dụng Contract.Assume, giả sử rằng nó sẽ luôn tìm thấy thứ gì đó, nhưng sau đó tôi cần làm điều đó trong tất cả các phương thức đọc dữ liệu từ cơ sở dữ liệu.

Tôi có thiếu thứ gì đó ở đây hay hành vi dự định khi bạn đang làm việc với cơ sở dữ liệu và LINQ?

+0

"Nguồn" là gì? Có bất kỳ phương pháp nào bạn đang gọi có hợp đồng không? –

+2

Có phải [this] (http://stackoverflow.com/questions/3050279/how-to-avoid-source-null-when-using-code-contracts-and-linq-to-sql) không? – adrianbanks

+0

@Anon: Tôi không biết "nguồn" là gì. Tôi không biết nếu có hợp đồng về các phương pháp trong khung Entity, nhưng tôi không nghĩ như vậy. @adrianbanks: Không xin lỗi, tôi không thể thấy nó có thể giúp tôi như thế nào. – Vern

Trả lời

2

Tôi đoán là một trong các phương thức CreateSet, OfType và AsEnumerable được khai báo là một phương thức mở rộng với tham số này được gọi là "source", và CodeContrcts không thể chứng minh nó không phải là null. Ngoài ra, bạn không cần phải thêm một mệnh đề Yêu cầu để xác định rằng _uow là không null trên mục nhập?

CreateSet có vẻ là phương thức tiện ích mở rộng vì nó không xuất hiện trong MSDN. Nếu phương pháp này không bao giờ nên trở về null, bạn có thể thực hiện điều này bằng cách thêm hợp đồng này để CreateSet:

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

Khi phân tích CodeContracts thấy quy tắc này, nó sẽ mất nó như là bằng chứng cho thấy đầu vào OfType sẽ không được null, và cảnh báo sẽ biến mất.

+0

Nó rất có thể là 'AsEnumerable', trong đó có điều kiện tiên quyết 'source! = Null'. Tôi không chắc chắn nếu có nhiều (bất kỳ?) Hợp đồng về phương pháp trong khung Entity, do đó, không phải 'CreateSet' cũng không' OfType' có postconditions trên chúng. Bạn có thể cần tạo các hàm bao bọc của riêng bạn. – porges

+0

Bạn chỉ có thể đặt điều kiện tiên quyết nếu người gọi mã có trách nhiệm thực hiện điều kiện tiên quyết đó. Trong trường hợp này, có vẻ như _uow là trách nhiệm nội bộ, không phải là trách nhiệm của người gọi. – koenmetsu

+0

bạn nói đúng rằng tôi cần một mệnh đề Yêu cầu để xác định rằng _uow là không null. Nhưng sau khi thêm rằng tôi vẫn nhận được lỗi. @ Porges: Tôi nghĩ rằng bạn đang đúng về AsEnumerable là nguyên nhân ở đây. Tôi đã làm một số thử nghiệm với AsEnumerable và tôi đã nhận được vấn đề ở đây là tốt. Nó có vẻ như một công việc khá tẻ nhạt để viết các hàm bao bọc cho nhiều hàm - khi sử dụng các API của bên thứ ba không sử dụng các hợp đồng mã. Tôi sẽ phải xem xét lại bằng cách sử dụng các hợp đồng mã. – Vern

Các vấn đề liên quan