Necesito exponer un contexto de datos de Entity Framework a complementos de terceros. El propósito es permitir que estos complementos obtengan datos únicamente y no permitirles que realicen inserciones, actualizaciones o eliminaciones o cualquier otro comando de modificación de la base de datos. Por lo tanto, ¿cómo puedo hacer que un contexto de datos o una entidad sean de solo lectura?
112
DbContext
, dales unaIQueryable
o varias.Respuestas:
Además de conectarse con un usuario de solo lectura, hay algunas otras cosas que puede hacer con su DbContext.
fuente
AsNoTracking()
hará que sea imposible usar la carga diferida.public override Task<int> SaveChangesAsync()
también.(context as IObjectContextAdapter).ObjectContext.SaveChanges()
seguirá funcionando. La mejor opción es usar elDbContext(string nameOrConnectionString);
constructor con una cadena de conexión de lectura / escritura para la creación de bases de datos y una cadena de conexión de solo lectura después.A diferencia de la respuesta aceptada, creo que sería mejor favorecer la composición sobre la herencia . Entonces no habría necesidad de mantener métodos como SaveChanges para lanzar una excepción. Además, ¿por qué necesita tener tales métodos en primer lugar? Debe diseñar una clase de manera que su consumidor no se deje engañar cuando mire su lista de métodos. La interfaz pública debe estar alineada con la intención y el objetivo reales de la clase, mientras que en la respuesta aceptada tener SaveChanges no implica que el contexto sea de solo lectura.
En lugares donde necesito tener un contexto de solo lectura, como en el lado de lectura del patrón CQRS , utilizo la siguiente implementación. No proporciona nada más que funciones de consulta a su consumidor.
Al usar ReadOnlyDataContext, puede tener acceso solo a las capacidades de consulta de DbContext. Digamos que tiene una entidad llamada Order, entonces usaría la instancia ReadOnlyDataContext de la siguiente manera.
fuente
IDisposable
public IQueryable<TEntity> Get<TEntity>() where TEntity : class { return _dbContext.Query<TEntity>().AsNoTracking(); }