Eu preciso expor um Entity Framework Data Context para plug-ins de terceiros. O objetivo é permitir que esses plug-ins busquem apenas dados e não permitir que eles façam inserções, atualizações ou exclusões ou quaisquer outros comandos de modificação do banco de dados. Portanto, como posso tornar um contexto de dados ou entidade somente leitura.
112
DbContext
, dê-lhes umIQueryable
ou vários.Respostas:
Além de conectar-se a um usuário somente leitura, existem algumas outras coisas que você pode fazer no seu DbContext.
fonte
AsNoTracking()
tornará impossível o carregamento lento.public override Task<int> SaveChangesAsync()
também.(context as IObjectContextAdapter).ObjectContext.SaveChanges()
ainda funcionará. A melhor escolha é usar oDbContext(string nameOrConnectionString);
contstructor com uma cadeia de conexão de leitura / gravação para a criação de banco de dados e uma cadeia de conexão somente leitura posteriormente.Ao contrário da resposta aceita, acredito que seria melhor favorecer a composição em vez da herança . Então, não haveria necessidade de manter métodos como SaveChanges para lançar uma exceção. Além disso, por que você precisa ter esses métodos em primeiro lugar? Você deve projetar uma classe de forma que seu consumidor não seja enganado ao olhar sua lista de métodos. A interface pública deve estar alinhada com a intenção real e objetivo da classe, enquanto a resposta aceita ter SaveChanges não significa que o Contexto é somente leitura.
Em lugares onde preciso ter um contexto somente leitura, como no lado Leitura do padrão CQRS , uso a implementação a seguir. Ele não fornece nada além de recursos de consulta para seu consumidor.
Usando ReadOnlyDataContext, você pode ter acesso apenas a recursos de consulta de DbContext. Digamos que você tenha uma entidade chamada Order, então você usaria a instância ReadOnlyDataContext da maneira abaixo.
fonte
IDisposable
public IQueryable<TEntity> Get<TEntity>() where TEntity : class { return _dbContext.Query<TEntity>().AsNoTracking(); }