2016-02-01 62 views
1

我首先使用實體​​框架6與數據庫。在當前的項目中,我在數據庫中有一些永遠不應該被Entity Framework獲取的行。比方說,我有這樣的簡化模型:始終從實體框架中的DbSet排除一些行

public partial class Customer 
    { 
     public Customer() 
     { 

     } 

     public int Id { get; set; } 
     public string Name { get; set; } 
     public DateTime? Deleted { get; set; } 
    } 

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

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 
     } 

     public virtual DbSet<Customer> Customers { get; set; } 
    } 

我每次做的CustomerDBSet我真的只是想獲取有Deleted == null項目的操作。這是因爲系統有時會將客戶標記爲已刪除,然後應用程序不應該知道這些項目(就好像它們不存在一樣)。

該模型在現實中更加複雜,這就是爲什麼我想在DbContext級別控制此模型,而不是在每個查詢中添加Where()條款。

有沒有辦法總是根據表中的列排除項目?

事情是這樣:

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
     Customers = Customers.Where(x => x.Deleted == null); // Obviously not working... 
    } 

    public virtual DbSet<Customer> Customers { get; set; } 
} 

編輯: 這將適用於在一個複雜的模型大約20-30不同的實體。所以我想避免查看,並用代碼來管理它。

編輯2: 感謝您關於EntityFramework.DynamicFilters的提示。但是,它似乎並未首先支持數據庫。

對不起,但是當使用Database First時,我們無權訪問 模型配置,因此不支持此功能。

https://github.com/jcachat/EntityFramework.DynamicFilters/issues/41

+0

在EF6中,至少可以通過攔截器來實現這一點。不過,使用實現過濾器的包可能會更容易,不過,就像NHibernate一樣。 – sschimmel

+0

或[EntityFramework.DynamicFilters](https://github.com/jcachat/EntityFramework.DynamicFilters)。另請參見:http://stackoverflow.com/a/34343982/861716 –

+0

儘管事實上這些問題並無關聯,但我會將來自@GertArnold的鏈接回答稱爲此問題的有效重複。但那個答案是完美的。 – krillgar

回答

1

如何製作自定義視圖

dbo.AvailableCustomers

這樣的:

CREATE VIEW dbo.AvailableCustomers 
AS SELECT * FROM Customers 
Where Deleted IS NULL; 

,然後選擇上下文的客戶DBSet將指向新視圖。

+0

好主意。但最終它會在很多表格上實施。我已經更新了我的問題。 – smoksnes