2009-10-03 4 views
3

J'ai une petite application ASP.NET MVC avec les objets entité suivante:Mise à jour de clé étrangère (entité) avec l'entité cadre V1

Personne

  • personID
  • Nom (string)
  • Prénom (chaîne)
  • Pays (Pays)

Pays

  • CountryId
  • Nom

Je peux ajouter et supprimer l'entité de cela fonctionne très bien. Je peux aussi mettre à jour le nom, prénom. Mais comment puis-je mettre à jour la propriété du pays avec un autre pays.

je tentais

p.Country = (from c in db.Country 
      where c.CountryId == countryId 
      select c).First(); 

mais cela déclenche une exception { « Un objet avec la même clé existe déjà dans le ObjectStateManager. Le ObjectStateManager ne peut pas suivre plusieurs objets avec la même clé. »} »

même avant d'appeler SaveChanges sur le DataContext.

quelqu'un peut-il explaind comment je peux mettre à jour cette propriété?

genre salutations Dieter

Répondre

2

Est-ce que db est votre contexte? Vous devriez être en mesure de le faire:

p.Country = ctx.Country.First(c => c.CountryId == countryId); 

Ou, si vous ne voulez pas interroger la base de données pour obtenir l'entité clé étrangère, vous pouvez également utiliser un EntityKey dans le même sens:

p.CountryReference.EntityKey = new EntityKey("MyDb.Country", "CountryId", countryId); 
+0

db est mon contenxt, mais votre solution doesen't travail, je reçois une exception sur la ligne p.Country = db.Country.First ... {"Un objet avec la même clé existe déjà dans ObjectStateManager Le ObjectStateManager ne peut pas suivre plusieurs objets avec la même clé."} – Dieter

+0

Odd. Avez-vous essayé la deuxième solution? –

0

J'ai utilisé la deuxième solution et je n'ai pas eu d'exception, mais le CountryId n'a pas été changé dans la base de données même après avoir appelé AcceptChanges.

+0

Bonjour Dav vous codez des travaux pour de nouveaux pays, je veux mettre à jour une propriété de pays avec un autre pays existant. mais thx de toute façon ce qui a trait dieter – user183638

+0

@Deiter, dans le @theNewCountryID mis l'ID du pays existant dans la table des pays que vous souhaitez mettre à jour l'enregistrement personne à. Peut-être que c'était un mauvais choix de noms de variables! – DaveB

+0

encore obtenu exception - \t \t { «. Un objet avec la même clé existe déjà dans le ObjectStateManager Le ObjectStateManager ne peut pas suivre plusieurs objets avec la même clé »} {\t System.Exception System.InvalidOperationException} Wich est normal parce que je attacher le pays qui est déjà connu par l'objet statemanager – user183638

0

Un code similaire à celui-ci a fonctionné pour moi lors de la mise à jour des propriétés de navigation.

Country country = new Country{CountryId = theNewCountryID }; 
    db.AttachTo("Countries", country); 
    p.Country = country; 
    db.Savechanges(); 

Créer un talon du nouveau pays puis l'attacher au pays EntitySet, attribuer le nouveau pays à la navigation de votre entité propriété et appelez SaveChanges(). Utilisez le nom EntitySet de votre pays dans l'appel AttachTo.

0

C'est ce qui a fonctionné pour moi. Dans le modèle:

<%= Html.Textbox("Country.CountryId", Model.Countries) %> // I'm using a form model view 

Dans le contrôleur:

Person originalPerson = (from p in db.PersonSet 
         where p.PersonId == updatedPerson.PersonId 
         select p).First(); 

Country country = (from c in db.CountrySet 
        where c.CountryId == updatePerson.Country.CountryId 
        select c).First(); 

db.Attach(country); 
originalPerson.Country = country; 
db.ApplyPropertyChanges(originalPerson.EntityKey.EntitySetName, updatedPerson); 
db.Savechanges(); 
Questions connexes