Fixation d'une entité de type a échoué en raison d'une autre entité du même type a déjà la même valeur de clé primaire
Message d'erreur: l'ajout d'une entité de type a échoué en raison d'une autre entité du même type a déjà la même valeur de clé primaire.
Question: Comment puis-je attaché à une entité dans un mode similaire, comme le montre le AttachActivity méthode dans le code ci-dessous?
Je suppose "une autre entité" partie de message d'erreur ci-dessus se réfère à un objet qui existe dans la mémoire, mais qui est hors de portée (??). Je note ce parce que la propriété Locale de la DBSet pour le type d'entité que j'essaie de joindre renvoie zéro.
Je suis raisonnablement confiant que les entités n'existent pas dans le contexte, parce que j'ai pas le code et montre le contexte comme il est créé. Ces entités sont ajoutées dans les quelques lignes immédiatement après la création de la dbcontext.
Suis en train de tester pour les attachés entités indiquées ici:quelle est la façon la plus raisonnable pour savoir si l'entité est attaché à dbContext ou pas?
Lorsque l'on regarde les habitants dans les locaux de la fenêtre de visual studio, je ne vois aucune des entités de type d'Activité (indépendamment de l'ID) à l'exception de celui que je suis en train de la fixer.
Le code s'exécute dans cet ordre: Essayez -> ModifyProject -> AttachActivity
Code échoue dans la AttachActivity à la ligne de commentaire.
Notez le code entre le débogage des commentaires qui vont se jeter si toutes les entités ont été ajoutées au contexte.
private string AttachActivity(Activity activity)
{
string errorMsg = ValidateActivity(activity); //has no code yet. No. It does not query db.
if(String.IsNullOrEmpty(errorMsg))
{
//debug
var state = db.Entry(activity).State; //Detached
int activityCount = db.Activities.Local.Count;
int projectCount = db.Activities.Local.Count;
if (activityCount > 0 || projectCount > 0)
throw new Exception("objects exist in dbcontext");
//end debug
if (activity.ID == 0)
db.Activities.Add(activity);
else
{
db.Activities.Attach(activity); //throws here
db.Entry(activity).State = System.Data.Entity.EntityState.Modified;
}
}
return errorMsg;
}
public int ModifyProject(Presentation.PresProject presProject, out int id, out string errorMsg)
{
//snip
foreach (PresActivity presActivity in presProject.Activities)
{
Activity a = presActivity.ToActivity(); //returns new Activity object
errorMsg = ValidateActivity(a); //has no code yet. No. It does not query db.
if (String.IsNullOrEmpty(errorMsg))
{
a.Project = project;
project.Activities.Add(a);
AttachActivity(a);
}
else
break;
}
if (string.IsNullOrEmpty(errorMsg))
{
if (project.ID == 0)
db.Projects.Add(project);
else
db.AttachAsModfied(project);
saveCount = db.SaveChanges();
id = project.ID;
}
return saveCount;
}
C'est la classe qui nouvelles le dbContext:
public void Try(Action<IServices> work)
{
using(IServices client = GetClient()) //dbContext is newd up here
{
try
{
work(client); //ModifyProject is called here
HangUp(client, false);
}
catch (CommunicationException e)
{
HangUp(client, true);
}
catch (TimeoutException e)
{
HangUp(client, true);
}
catch (Exception e)
{
HangUp(client, true);
throw;
}
}
Je ne suis pas de se demander: Comment puis-je utiliser AsNoTracking Quelle est la différence .AsNoTracking() faire?
bonne prise - et je n'ai pensé à ça. Dans mon projet le projet de la classe a une propriété qui est une Liste<Activité>. Cependant, dans le code de débogage dans AddActivity je suis à la recherche de projet objets ajoutés au contexte et il n'en existe aucune.
Veuillez vous référer à ma réponse sur ASP.NET MVC - Fixation d'une entité de type "MODELNAME" a échoué à cause d'une autre entité du même type a déjà la même valeur de clé primaire.
OriginalL'auteur Sam | 2014-11-12
Vous devez vous connecter pour publier un commentaire.
Une solution pour éviter de recevoir cette erreur est à l'aide de
Find
méthode. avant de fixer entité, requêteDbContext
d'une entité, si l'entité existe dans la mémoire, vous obtenez de l'entité locale autrement entité seront extraites de la base de données.OriginalL'auteur Mohsen Esmailpour
Fixation d'une entité de type a échoué en raison d'une autre entité du même type a déjà la même valeur de clé primaire. Cela peut se produire lors de l'utilisation de la
Attach
méthode ou la mise à l'état d'une entité àUnchanged
ouModified
si toutes les entités dans le graphe de conflit de valeurs de clé. Cela peut être parce que certaines entités sont nouveaux et n'ont pas encore reçu de base de données-clé générée de valeurs. Dans ce cas, utilisez laAdd
.La solution est de
si vous deviez utiliser GetAll()
Changement De
OriginalL'auteur Jaykishan
J'ai résolu cette erreur en changeant de méthode de mise à Jour comme ci-dessous.
si vous utilisez générique référentiel et Entité
ou normal(non générique) le référentiel et l'entité , puis
Si vous utilisez AddOrUpdate() la méthode , assurez-vous que vous avez ajouté
"Système.Les données.De l'entité.Les Migrations" espace de noms.
OriginalL'auteur dush88c