83

Potrzebuję odsłonić Kontekst danych Entity Framework do wtyczek 3rd party. Celem jest umożliwienie tym wtyczkom pobierania wyłącznie danych i nie pozwalanie im na wstawianie wstawek, aktualizacji lub usunięć lub jakichkolwiek innych komend modyfikacji bazy danych. W związku z tym, jak mogę utworzyć kontekst danych lub podmiot tylko do odczytu.Jak dokonać Entity Framework Data Context Readonly

+3

Podaj im kontekst z użytkownikiem, który nie ma prawa zapisu do bazy danych. – vcsjones

+0

Dzięki. Im przy użyciu bazy danych SQLite. Właśnie się dowiedziałem, że można go otworzyć w trybie tylko do odczytu za pomocą opcji połączenia. – Harindaka

+0

Nie podawaj im 'DbContext', daj im' IQueryable' lub kilka. –

Odpowiedz

133

Oprócz łączenia się z użytkownikiem tylko do odczytu, istnieje kilka innych czynności, które można wykonać w 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

było oczywiste, że jesteś "człowiekiem wewnętrznym" :) - jest to o wiele bardziej interesujące niż połączenie "tylko do odczytu". – NSGaga

+3

Pamiętaj, że użycie 'AsNoTracking()' uniemożliwi korzystanie z leniwego ładowania. –

+0

@ TomPažourek Nie wiem, czy to prawda ... Wydaje mi się, że EF nadal tworzy leniwy ładujące się serwery proxy, ale rozpoznawanie tożsamości może być trochę dziwne. – bricelam