2009-08-14 5 views
2

J'ai une question qui est assez similaire à cette question:problème avec EDM dans ASP.NET MVC

Strongly-Typed ASP.NET MVC with Entity Framework

mais les solutions pour cette question ne fonctionne pas pour moi. Permettez-moi de commencer en disant que je ne connais pas grand chose au sujet dont je parle.

J'ai le code suivant

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(PaymentInformation paymentInformationToEdit, int pensionFundID) 
{ 
var originalPaymentInformation = (from PIs in _db.PaymentInformation 
            where PIs.employeeNumber == paymentInformation.employeeNumber 
            select PIs).First(); 

var laborUnion = (from LUs in _db.LaborUnion 
        where LUs.laborUnionID = laborUnionID 
        select LUs)First(); 
paymentInformationToEdit.laborUnion = laborUnion; 

_db.ApplyProperyChanges(originalPaymentInformation.EntityKey.EntitySetName, paymentInformationToEdit); 
_db.SaveChanges(); 
} 

Je reçois une erreur lorsque je tente de les ApplyProperyChanges disent: « L'objet existant dans le ObjectContext est dans l'état ajouté. Les modifications ne peuvent être appliquées que lorsque l'objet existant est dans un état inchangé ou modifié ».

Je ne sais pas comment changer l'état de l'un ou l'autre, ou même si je fais quelque chose de fondamentalement faux. Veuillez nous conseiller

EDIT: J'espère que c'est le chemin à parcourir ici sur stackoverflow. Je n'ai pas eu de réponse qui a résolu mon problème mais Gregoire ci-dessous a posté une solution possible que je n'ai pas comprise. J'espère que cette modification heurtera ma question pour que quelqu'un la voit et m'aide. Désolé si ce n'est pas le chemin à parcourir.

Répondre

0

Vous devez mettre à jour les informations de originalPaymentInformation avec l'un des paymentInformationToEdit puis ApplyProperyChanges sur originalPaymentInformation

+0

Je ne suis pas sûr que je comprends. J'ai essayé de faire: originalPaymentInformation.Employee = paymentInformationToEdit.Employee; mais cela me donne juste une erreur en disant 'Une violation de la contrainte d'intégrité référentielle s'est produite. Une propriété qui fait partie de la contrainte d'intégrité référentielle ne peut pas être modifiée lorsque l'objet a une clé non temporaire. Est-ce que je ne comprends pas votre réponse? – Mannsi

0

Un changement d'état des entités lorsque vous modifiez. Il doit être dans l'état détaché. Si vous modifiez une relation, elle passera à l'état ajouté. Cela signifie que vous ne pouvez pas modifier la relation laborUnion avant d'appliquer les modifications. Cependant, je ne peux pas comprendre comment changer la relation sans que le framework ajoute automatiquement une nouvelle entité, ce qui est exactement la même chose que la relation. J'espère que cela vous aidera sur votre chemin.

0

Ceci est parce que vous ne pouvez pas éditer des références en mode caché. Object devrait avoir ObjectContext pour pouvoir effectuer ce changement. solution à votre problème consiste à mettre à jour la référence dans l'objet oryginal et de repos - « statique » - champs par les ApplyProperyChanges:

 
public ActionResult Edit(PaymentInformation paymentInformationToEdit, int pensionFundID) 
{ 
var originalPaymentInformation = (from PIs in _db.PaymentInformation 
            where PIs.employeeNumber == paymentInformation.employeeNumber 
            select PIs).First(); 

var laborUnion = (from LUs in _db.LaborUnion 
        where LUs.laborUnionID = laborUnionID 
        select LUs)First(); 
originalPaymentInformation.laborUnion = laborUnion; 

_db.ApplyProperyChanges(originalPaymentInformation.EntityKey.EntitySetName, paymentInformationToEdit); 
_db.SaveChanges(); 
}