83

我需要向第三方插件公開實體框架數據上下文。目的是允許這些插件僅提取數據,而不是讓他們發佈插入,更新或刪除或任何其他數據庫修改命令。因此,我如何才能使數據上下文或實體只讀。如何使實體框架數據上下文只讀

+3

給他們一個上下文,用戶沒有對數據庫的寫入權限。 – vcsjones

+0

謝謝。我使用SQLite數據庫。剛剛發現它可以通過連接字符串選項以只讀模式打開。 – Harindaka

+0

不要給他們一個'DbContext',給他們一個'IQueryable'或幾個。 –

回答

133

除了與只讀用戶連接之外,還可以對DbContext執行其他一些操作。

public class MyReadOnlyContext : DbContext 
{ 
    // Use ReadOnlyConnectionString from App/Web.config 
    public MyContext() 
     : base("Name=ReadOnlyConnectionString") 
    { 
    } 

    // Don't expose Add(), Remove(), etc. 
    public DbQuery<Customer> Customers 
    { 
     get 
     { 
      // Don't track changes to query results 
      return Set<Customer>().AsNoTracking(); 
     } 
    } 

    public override int SaveChanges() 
    { 
     // Throw if they try to call this 
     throw new InvalidOperationException("This context is read-only."); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // Need this since there is no DbSet<Customer> property 
     modelBuilder.Entity<Customer>(); 
    } 
} 
+0

很明顯你是一個'內部人':) - 這比'readonly'連接更有趣 – NSGaga

+3

請注意,使用'AsNoTracking()'將使得不可能使用延遲加載。 –

+0

@TomPažourek我不知道這是真的......我認爲EF仍然會創建延遲加載代理,但身份解析可能會變得有點怪異。 – bricelam