J'utilise entity framework pour conserver les données dans une application Wpf N-tier. Mon dbcontext est partagé entre tous les référentiels et n'est jamais éliminé. Quand je persiste, je marque un objet comme modifié et j'essaie d'enregistrer les changements. Si une erreur persiste pendant la persistance de l'objet, l'objet est toujours marqué comme modifié et si l'utilisateur abandonne l'opération en cours, il aura la même erreur lors de l'enregistrement d'un autre objet.Récupération après exception lors de l'utilisation d'un seul dbcontext
Je l'ai résolu en remplaçant SaveChanges dans mon dbcontext et si une erreur se produit j'accepte tous les changements (voir le code ci-dessous). Donc si une erreur accurs l'objet et tous les objets sont marqués inchangés même s'ils ne sont pas persévérés.
Cela ne semble pas normal ... Est-ce que quelqu'un est d'accord avec cette solution? Une autre solution consisterait à remplacer le dbcontext dans chaque méthode dans mes référentiels et à les éliminer immédiatement. Cela rendra mes dépôts plus compliqués et "noicy" et je perdrai aussi la possibilité de charger des données paresseuses ... Est-ce que quelqu'un a une solution différente pour moi?
//In my repositories
public void UpdateObject(Object object)
{
dbContext.Entry(object).State = EntityState.Modified;
dbContext.SaveChanges();
}
//In my dbcontext class
private ObjectContext ObjectContext()
{
return (this as IObjectContextAdapter).ObjectContext;
}
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (Exception)
{
ObjectContext().AcceptAllChanges();
throw;
}
}
Je pense à votre solution :) J'ai réfléchi à votre solution et pour moi cela ne fonctionne pas bien. J'utilise TDD et injeciton de dépendance. Les repos sont envoyés via l'injection du constructeur dans ma logique métier.Avec votre solution, je devrais avoir une usine pour le dbcontext et une usine pour chaque référentiel. Cela donne l'impression de trop compliquer la logique métier et la logique métier avec des sujets qui ne les concernent pas ... – Jakob
Dans la logique métier ci-dessus, le dbcontext et les référentiels peuvent être transmis via l'injection du constructeur. Comme je l'ai mentionné dans ma réponse, ce n'est qu'un exemple simplifié. Si vous effectuez des recherches sur Google à l'aide de mots clés tels que la durée de vie de la base de données dbcontext, vous constaterez que la plupart des utilisateurs recommandent d'avoir un contexte de courte durée. Dans ma propre expérience, nous avons trouvé un bug où quelqu'un avait oublié de se débarrasser d'un contexte et cela a causé une requête de 50 ms sur le webservice de prendre 3,2 minutes à exécuter. – failedprogramming