2012-01-17 25 views
7

Tôi đang cố gắng thực hiện điều gì đó tương đối dễ dàng, nhưng tôi không biết cách xây dựng nó.Entity Framework 4.1 - Thực thể ghi đè (DBSet) với Bộ lọc

Tôi có một thực thể được tạo mà tôi muốn ghi đè bằng cách thêm câu lệnh Linq Where.

Theo Thông tư này partial cho bối cảnh:

public partial class MyEntities: DbContext 
{ 
    public MyEntities() 
     : base("name=MyEntities") 
    { 
    }  
    public DbSet<Assignee> Assignees { get; set; } 
} 

tôi đã tạo ra một phần mới của MyEntities và thử như sau

public override DbSet<Assignee> Assignees 
{ 
    get 
    { 
     return this.Assignees.Where(z => z.IsActive == true); 
    } 
    set; 
} 

nhưng điều này ném một lỗi mơ hồ (đó là hiển nhiên).

Tôi làm cách nào để thực hiện việc này?

Cảm ơn

Trả lời

10

Cố gắng phơi bày DbSet<Assignee>IQueryable<Assignee> với tên gọi khác nhau

public partial class MyEntities: DbContext 
{ 
    public MyEntities() 
     : base("name=MyEntities") 
    { 
    } 

    public DbSet<Assignee> AssigneesSet { get; set; } 

    public IQueryable<Assignee> Assignees 
    { 
     get 
     { 
      return AssigneesSet.Where(z => z.IsActive == true); 
     } 
    } 
} 
+0

Điều này có vẻ hợp lý nhất ... Không chắc chắn nếu điều này là sẽ làm việc mặc dù vì EF vẫn sẽ tạo ra công khai DbSet Assignees {get; bộ; } và sẽ không được sử dụng khi gọi context.Assignees? – Fox

+0

@Fox Sau đó, bạn có thể thay đổi tên theo cách thủ công hoặc đặt tên khác cho thuộc tính 'IQueryable '. – Eranga

+0

Đẹp nhất, nó hoạt động hoàn hảo.Tôi chỉ cần đặt DbSet được bảo vệ để chỉ hiển thị một thuộc tính từ DbContext để đổ vào intellisense;) –

2
public override DbSet<Assignee> Assignees 
{ 
    get 
    { 
     return base.Assignees.Where(z => z.IsActive == true); 
    } 
    set; 
} 

này những gì bạn muốn?

+0

Tôi không thể làm điều đó vì tôi không kế thừa từ MyEntities ... Kế thừa từ DbContext – Fox

+1

Tại sao bạn không tạo một lớp kế thừa từ mã được tạo và ghi đè hành vi của thuộc tính? – linkerro

+0

Quá nhiều thay đổi mã .. tôi phải thay đổi rất nhiều mã trong DAL của tôi ... ý tưởng tốt mặc dù – Fox

2

Bạn đã thử thêm một điều kiện để các Mapping bảng trong mô hình của bạn? Nhấp chuột phải vào thực thể trong edmx của bạn và chọn "Lập bản đồ bảng". Sau đó, "Thêm một điều kiện". Có lẽ là một giải pháp thanh lịch hơn.

+0

Vấn đề với cách tiếp cận này là EF không cho phép bạn thêm bộ lọc cho các thuộc tính được ánh xạ. Trong ví dụ này, anh ta sẽ phải loại bỏ cột IsActive khỏi ánh xạ, có nghĩa là EF sẽ không lưu các thay đổi vào trường IsActive. Tôi đã đập đầu vào bàn làm việc của tôi trong nhiều giờ cố gắng vặn vẹo một cách xung quanh nó, nhưng vô ích. – demius

0

Thực hành tốt là tạo các lớp lưu trữ trong thư mục DAL (sử dụng tên bạn muốn). Sau đó, làm các bộ lọc ở đó. Đây là một hướng dẫn microsoft cho rằng:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

Tùy thuộc vào điều kiện mà bạn muốn không thể để đưa vào điều kiện lập bản đồ EF, đây là lý do: http://entityframework.codeplex.com/workitem/48

0

Tôi biết đây là siêu cũ, nhưng một cách đơn giản và thanh lịch khác, không thay đổi bất kỳ tên hiện có nào, đang sử dụng từ khóa new để ẩn thành viên ban đầu, như sau:

public new IQueryable<Assignee> Assignees 
{ 
    get 
    { 
     return base.Assignees.Where(z => z.IsActive == true); 
    } 
} 

Chỉ muốn chia sẻ cho bất kỳ khách truy cập trong tương lai, hy vọng nó sẽ giúp!

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