-1
votes

Problème architecturale avec référentiel générique, unité de travail, unité

Je travaille sur l'une de mes architecture de projet en utilisant MVC5, EntityFramework, Unity, UnitOfwork and Generic Repository, je n'ai également pas utilisé Simpleapper ou quoi que ce soit d'autre que Simple Automapper.

Chaque fois que j'effectue une mise à jour pour la première fois, cela fonctionne parfaitement, mais pour la deuxième fois, cela me donne ci-dessous une erreur.

Fixation d'une entité de type 'EntityModel.TBLCompanyMaster' a échoué car une autre entité du même type a déjà la même valeur principale. Cela peut se produire lors de l'utilisation de la méthode "Attacher" ou de définir l'état d'une entité à "inchangée" ou "modifiée" si des entités du graphique ont des valeurs de clé en conflit. Cela peut être parce que certaines entités sont nouvelles et n'ont pas encore reçu de valeurs clés générées par la base de données. Dans ce cas, utilisez la méthode "Ajouter" ou l'état d'entité "ajouté" pour suivre le graphique, puis définir l'état des entités non nouvelles vers "inchangées" ou "modifiée", selon le cas.

erreur se produit dans la méthode de mise à jour ici [_dbset.attach (entité)] xxx

Voici mon code:

1 ) Unity xxx

2) unité de travail xxx

3 3) référentiel générique xxx < / Pre>

J'ai essayé de nombreuses façons mais que je ne me aide pas, je crois que j'ai fait quelque chose de mal avec l'unité et l'unité de travail, mais difficile à identifier. Merci d'avance de m'aider.


1 commentaires

lancer ex; est une mauvaise pratique. Il suffit de ne pas attraper l'exception si vous ne faites rien avec elle.


3 Réponses :


0
votes

erreur est très claire. Voici la citation de ici :

attache l'entité donnée au contexte sous-jacent à l'ensemble. C'est-à-dire que l'entité est placée dans le contexte dans l'état inchangé, comme s'il avait été lu dans la base de données.
.....
.....
Joindre est un non-op si l'entité est déjà dans le contexte de l'état inchangé.

Lorsque vous appelez _dbbset.attach (entité); première fois, votre entité fait partie de DBSet ; c'est-à-dire que c'est placé dans le contexte. Cette entité a également un identifiant unique (valeur de clé primaire) qui est utilisée pour identifier une entité.

Maintenant, lorsque vous l'appelez pour la deuxième fois, l'identifiant / la clé est identique. Deux entités avec le même identifiant ne peuvent pas exister dans un DBSet .

Vous devez vérifier avant appeler joindre si l'entité existe déjà.

Utiliser _dbset.find (clé) avant d'appeler joindre . S'il existe déjà, n'appelez pas joindre . Ce peut être utile.


Pas la partie de votre question, mais je suppose que la façon dont vous mettez la mise à jour de l'enregistrement n'est pas correcte. Si vous souhaitez mettre à jour l'enregistrement, de meilleurs moyens d'obtenir ( Rechercher / SIMOREFAULT ) it à partir de la base de données => Modifier la propriété (ies) que vous souhaitez modifier => Flush (appel SAVECHANGES ) Les modifications. Veuillez vous reporter à Cette question.


0 commentaires

0
votes

Chaque fois que j'effectue une mise à jour pour la première fois, cela fonctionne parfaitement, mais pour la deuxième fois, cela me donne ci-dessous une erreur.

Vous essayez probablement de réutiliser une instance DBContext pour plusieurs demandes. Votre conteneur DI semble enregistrer des choses comme singletons. Le dBContext doit être scopé par demande.


1 commentaires

J'ai essayé d'ajouter de la portée DBContext à la demande, mais pas de chance, je pourrais poser problème, peut-on suggérer un changement exact de l'unitéConfig, que vous parlez.



0
votes

Sous le code ci-dessous m'aide à trouver ma solution, appelez simplement cette méthode avant de joindre () lors de la mise à jour:

public Boolean Exists(T entity) {
var objContext = ((IObjectContextAdapter)this._dbContext).ObjectContext;
var objSet = objContext.CreateObjectSet<T>();
var entityKey = objContext.CreateEntityKey(objSet.EntitySet.Name, entity);

Object foundEntity;
var exists = objContext.TryGetObjectByKey(entityKey, out foundEntity);

if (exists) {
    objContext.Detach(foundEntity);
}
return (exists);
}


1 commentaires

Ce n'est pas une bonne pratique cependant. Avec ORM comme Frame d'entité, vous feriez mieux de comprendre comment fonctionne UWO. Détachement de l'entité et se redressez sans signification. Pourquoi ne pas modifier votre entité ci-jointe elle-même?