J'ai besoin d'exposer un contexte de données Entity Framework à des plugins tiers. Le but est de permettre à ces plugins de récupérer uniquement des données et de ne pas les laisser émettre des insertions, des mises à jour ou des suppressions ou toute autre commande de modification de base de données. Par conséquent, comment puis-je créer un contexte de données ou une entité en lecture seule.
112
DbContext
, donnez-leur unIQueryable
ou plusieurs.Réponses:
En plus de vous connecter avec un utilisateur en lecture seule, vous pouvez effectuer d'autres opérations sur votre DbContext.
la source
AsNoTracking()
rendra impossible l'utilisation du chargement différé.public override Task<int> SaveChangesAsync()
également.(context as IObjectContextAdapter).ObjectContext.SaveChanges()
cela fonctionnera toujours. Le meilleur choix est d'utiliser leDbContext(string nameOrConnectionString);
contstructor avec une chaîne de connexion en lecture / écriture pour la création de base de données et une chaîne de connexion en lecture seule par la suite.Contrairement à la réponse acceptée, je pense qu'il vaudrait mieux favoriser la composition plutôt que l'héritage . Ensuite, il n'y aurait pas besoin de conserver des méthodes telles que SaveChanges pour lever une exception. De plus, pourquoi avez-vous besoin de telles méthodes en premier lieu? Vous devez concevoir une classe de manière à ce que son consommateur ne soit pas dupe lorsqu'il regarde sa liste de méthodes. L'interface publique doit être alignée sur l'intention et l'objectif réels de la classe, tandis que dans la réponse acceptée, le fait d'avoir SaveChanges n'implique pas que le contexte est en lecture seule.
Dans les endroits où j'ai besoin d'un contexte en lecture seule, comme dans le côté lecture du modèle CQRS , j'utilise l'implémentation suivante. Il ne fournit rien d'autre que des capacités d'interrogation à son consommateur.
En utilisant ReadOnlyDataContext, vous pouvez avoir accès uniquement aux fonctionnalités d'interrogation de DbContext. Supposons que vous ayez une entité nommée Order, alors vous utiliseriez l'instance ReadOnlyDataContext d'une manière comme ci-dessous.
la source
IDisposable
public IQueryable<TEntity> Get<TEntity>() where TEntity : class { return _dbContext.Query<TEntity>().AsNoTracking(); }