2010-10-20 29 views
37

Tôi sử dụng Khung thực thể chứa chế độ xem. Và tôi có truy vấn:Khuôn khổ thực thể. Xem bản ghi trùng lặp trả về

var data = this.context.vwRevenues 
    .Where(x => x.revenue >= 0); 
    .OrderByDescending(x => x.year) 
    .ThenByDescending(x => x.month) 
    .Take(10) 
    .ToList(); 

Truy vấn này trả về tập hợp các thực thể, nhưng thực thể thứ 1 bằng 5.

data[0] == data[4] // true 

Tôi lấy script sql cho truy vấn này từ tracer sql và chạy nó vào SQL Management Studio, nó trả hồ sơ khác nhau.

+0

thể trùng lặp của [Entity kết quả khuôn khổ sự khác biệt cho một quan điểm cơ sở dữ liệu] (http://stackoverflow.com/questions/3111112/entity-framework-result- khác biệt-cho-một-xem-cơ sở dữ liệu) –

+2

xe tăng cho câu trả lời của bạn. nó đã giúp –

+1

Giải quyết trong chủ đề này http://stackoverflow.com/questions/3977920/entity-framework-view-return-duplicate-records – bunjeeb

Trả lời

67

Theo @Giovane trả lời của

Chúng tôi đã có cùng một vấn đề trong hệ thống của chúng tôi với Entity Framework đối phó với quan điểm. Hãy thử sử dụng ROW_NUMBER() OVER() SQL để tạo một cột với các giá trị duy nhất, nhưng không hoạt động.

Tôi đã làm điều tương tự nhưng để làm cho nó hoạt động tôi cần phải mở mô hình EDMX và sau đó chọn một cột này là Khóa thực thể.

enter image description here

Sau đó, nó sẽ làm việc

Có một bài viết rất tốt trên

Duplicate Records

Các bài viết dòng quan trọng nhất này là:

Khi bao gồm một cái nhìn trong En của bạn Mô hình tity, mô hình dường như chỉ đơn giản sử dụng các cột không có giá trị đầu tiên làm khóa chính (vì tất cả các cột được sử dụng trong khóa chính phải không có giá trị null).

+3

bạn tiết kiệm Cuộc sống của tôi – Loai

+0

Điều gì có nghĩa là "cột đầu tiên không có giá trị"? Có bao nhiêu chính xác? Chắc chắn không phải tất cả trong số họ, hoặc người nào khác tôi sẽ không vấp phải vấn đề trong một khung nhìn mà không có bất kỳ cột không nullable nào. –

+0

Đó là một tính năng nhỏ lén lút ... Cảm ơn bạn đã sửa chữa tuyệt vời! – CodeBreaker

12

Chúng tôi đã gặp sự cố tương tự trong hệ thống của chúng tôi với Khung thực thể đối phó với chế độ xem. Hãy thử sử dụng ROW_NUMBER() OVER() SQL để tạo một cột với các giá trị duy nhất, nhưng không hoạt động.

Chúng ta cần chèn thêm một trường nữa, một FK cho một bảng khác trong khung nhìn để nó có thể thêm như một huấn luyện bổ sung cho mebro EntityKeyMembers Elimite và do đó vấn đề lặp lại.

Do đó, nếu sự cố vẫn tiếp diễn trong loại tình huống này, giải pháp là chèn cột FK cho nó là MEMBERS của các trường tạo thành EntityKey của bảng.

+0

Đọc câu trả lời của @Juan Carlos Sánchez Robles. ROW_NUMBER là một cách tốt để đi nhưng bọc nó bằng chức năng ISNULL – buckley

2

Trong giao diện thử chuyển đổi các bản ghi đầu tiên đến một giá trị không null, như thế này:

isnull(ROW_NUMBER() OVER (ORDER BY "Column"), 0) AS Row 

Nó chỉ đến khung Entity có thể là chìa khóa chính tự động.

1

Nếu bạn không muốn cập nhật edmx và thiết lập phím bất kỳ để cột & &

nếu bạn không muốn cập nhật xem kỷ lục (chỉ dành cho có được kỷ lục) sau đó sử dụng mã dưới đây làm việc của nó đối với tôi.

context.viewname.MergeOption = System.Data.Objects.MergeOption.NoTracking; 

context.viewname.Where(x => x.columnname != null); 
+0

đã hy vọng không phải thay đổi edmx, nhưng điều này đáng tiếc đã không làm việc cho tôi – sobelito

34

Bạn chỉ cần thực hiện: context.viewname.AsNoTracking().Where(x => x.ColumnName != null);

+1

Cảm ơn một loạt lời khuyên AsNoTracking(), dễ dàng hơn nhiều so với việc phải sửa đổi các thực thể của chúng ta cho một khóa ROW khác. :) – John

+0

. (Và đã không loại bỏ một số hồ sơ mà bản cập nhật EDMX đã làm.) – sobelito

+0

Cảm ơn, điều này làm việc cho tôi quá, nơi mà quan điểm của tôi không có trường khóa chính – user230910

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