2012-08-28 3 views
2

J'utilise Entity Framework. J'ai une table Person qui a une clé étrangère sur Table PersonCategory. Person Id est une identité auto-incrémentée (1,1). Chaque fois que je mets à jour l'entité personne, la structure d'entité insère une ligne pour la table PersonCategory, même si la catégorie est trouvée. Je suis en train d'utiliser le premier design de base de données.Entity Framework insertion d'une ligne pour la propriété de navigation même si la clé est trouvée

class Person 
{ 
    public string Name {get;set} 
    public PersonCategory {get;set;} 
} 

class PersonCategory 
{ 
    public int ID {get;set} 
    public string Name{get;set;} 
} 

Répondre

2

Vous devez d'abord fixer le existant au contexte;

var myPersonCat = new PersonCategory { ID = 1, Name = "Foo" }; 
var myPerson = new Person { Name = "Bar", PersonCategory = myPersonCat }; 

context.PersonCategories.Attach(myParentCat);  
context.People.Add(myPerson); 
+0

J'utilise un modèle de référentiel générique. J'ai essayé de cette façon, il insère toujours une catégorie de personne et met à jour l'objet Personne. Que ce soit sur la personne mise à jour ou sur Ajouter une nouvelle personne – Jey

+0

@Jey Vous l'avez peut-être mal fait. Pouvez-vous poster le code que vous avez essayé? – Eranga

+0

'l'aide (GenericRepository userAccountRepository = new GenericRepository ()) { \t utilisant (GenericRepository countryRep = new GenericRepository ()) { MyCountry = countryRep.First (pays => country.ID == 1); \t \t \t user.UserCountry = mycountry; countryRep.Attach (mycountry); userAccountRepository.Add (utilisateur); userAccountRepository.SaveChanges(); }} ' – Jey

0

Vous devez définir la State de votre PersonCategory-Unchanged avant d'enregistrer votre Person

+0

Ne fonctionne pas! – Jey

0

Pouvez-vous poster le code que vous utilisez pour mettre à jour? Il me semble que vous ajoutez une nouvelle personne à chaque fois, et avec une catégorie de personne ajouté pour le nouvel enregistrement. Ce que vous voulez est récupérer la personne que vous voulez du contexte EF, mettre à jour les champs que vous voulez, et de maintenir les changements au contexte, sans ajouter de nouvel élément à votre DB, de cette façon vous modifiez seulement un enregistrement existant les relations seront maintenues. Quelque chose comme

var myPerson = context.People.FindbyId(personId); 
myPerson.Name = "Joe"; 
myPerson.Age = "20"; 

context.SaveAllChanges(); 
+0

cela se produit dans les deux quand j'essaye d'insérer une nouvelle personne ou quand j'essaye de modifier un existant. – Jey

Questions connexes