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?

Pourquoi ne Entity Framework Réinsérer des Objets Existants dans Ma Base de données? msdn.microsoft.com/en-us/magazine/dn166926.aspx
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