83

Necesito exponer un Entity Framework Data Context a los complementos de terceros. El objetivo es permitir que estos complementos capturen solo datos y no les permitan emitir inserciones, actualizaciones o eliminaciones o cualquier otro comando de modificación de la base de datos. Por lo tanto, ¿cómo puedo hacer un contexto de datos o entidad de solo lectura?Cómo hacer que Entity Framework Data Context Readonly

+3

Déles un contexto con un usuario que no tenga acceso de escritura a la base de datos. – vcsjones

+0

Gracias. Estoy usando una base de datos SQLite. Acaba de descubrir que se puede abrir en modo de solo lectura a través de una opción de cadena de conexión. – Harindaka

+0

No les des un 'DbContext', dales un' IQueryable' o varios. –

Respuesta

133

Además de conectarse con un usuario de solo lectura, hay algunas otras cosas que puede hacer con su 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

era obvio que eres un "hombre interno" :) - esto es mucho más interesante que una conexión de 'solo lectura' – NSGaga

+3

Ten en cuenta que usar 'AsNoTracking()' hará que sea imposible usar la carga lenta. –

+0

@ TomPažourek No sé si eso es cierto ... Creo que EF todavía crea proxies de carga lenta, pero la resolución de la identidad puede ser un poco rara. – bricelam

Cuestiones relacionadas