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

あなたが「内部の人」であることは明らかでした:) - これは '読み取り専用'接続よりも面白いです。 – NSGaga

+3

'AsNoTracking()を使用すると、遅延読み込みを使用できなくなります。 –

+0

@TomPažourekそれが本当かどうかわかりません... EFはまだレイジーローディングプロキシを作成していますが、アイデンティティの解決はちょっと変わってしまうかもしれません。 – bricelam

関連する問題