2012-01-12 21 views
6

Vì vậy, đây là tình hình của tôi:Entity Framework, mềm xóa và truy vấn

Tôi mềm xóa một số hàng trong một bảng, sử dụng một lá cờ IsDeleted, do đó một có thể giữ một dấu vết của dữ liệu lưu trữ của tôi. Tôi làm như vậy bằng cách ghi đè tuyên bố SaveChanges trong số ObjectContext của tôi.

Câu hỏi đặt ra là: làm cách nào tôi có thể chọn chỉ (các) hàng có IsDeleted == false mà không phải chỉ định && !IsDeleted trong mỗi truy vấn?

Có cách nào tôi có thể chỉ định điều này trực tiếp trên ngữ cảnh của mình không?

tkx!

+0

EF Code-đầu tiên hay Model đầu tiên? – StriplingWarrior

+0

Thay vì Gắn cờ, hãy sử dụng một bảng. Đối với bảng đã xóa, PK có thể là PK giống như bảng chính, với PK của bảng bị xóa là FK đến bảng chính. Nếu bạn đã có một bản ghi trong xóa, sau đó nó bị xóa, nếu không hoạt động. Sau đó, nó chỉ là một tham gia đơn giản. Hiệu suất truy vấn sẽ tốt hơn so với sử dụng cờ bit. –

+0

@JonRaynor: Cơ sở dữ liệu không phải là chuyên môn của tôi, nhưng có vẻ như với tôi rằng việc kiểm tra cờ bit ít tốn kém hơn nhiều so với việc tham gia, đặc biệt vì bạn thường quan tâm hơn đến việc biết mục nào * không * bị xóa (và do đó không có mặt trong bảng đã xóa). Nếu cờ bit làm tổn thương hiệu năng truy vấn, tôi muốn một chỉ mục tạo ra một bảng hoàn toàn riêng biệt. – StriplingWarrior

Trả lời

7

Bạn có thể xác định một cái nhìn trên bảng của bạn và truy vấn điểm cho rằng thay vì:

CREATE VIEW dbo.ActiveData 
AS 
    SELECT (list of columns) 
    FROM dbo.YourTable 
    WHERE IsDeleted = 0 

Và sau đó trong mô hình EDMX của bạn, đọc dữ liệu của bạn từ quan điểm ActiveData thay cho bảng cơ sở.

6

Nếu bạn bấm chuột phải vào một EntitySet trong trình xem mô hình và bấm "Bảng ánh xạ", có một khu vực nơi bạn có thể "Thêm điều kiện". Điều này nên làm những gì bạn đang yêu cầu, mặc dù bạn có thể tốt hơn bằng cách sử dụng một View thay vì, theo gợi ý của marc_s.

+0

Lập bản đồ có điều kiện là cách chính xác để tham gia EF. Sử dụng chế độ xem như @marc được đề xuất hoạt động nhưng nó sẽ yêu cầu thay đổi bổ sung. –

+0

Bạn sẽ lập bản đồ có điều kiện như thế nào với mã đầu tiên, mà không có bản in vật lý? – danludwig

+0

@olivehour: http://stackoverflow.com/questions/8161689/entity-framework-conditional-mapping-with-code-first – StriplingWarrior

1

Đây là câu hỏi cũ, nhưng đối với bất kỳ ai mới đến đây. Tính đến EF 6 bạn thực sự nên sử dụng các bộ chặn cho loại truy vấn này. Nó đặt một truy vấn bên trong truy vấn SQL khi nó chạy và lọc các bản ghi dựa trên cờ.

Xem sau để biết thêm:

Soft Deleting Entities using Interceptors

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