2009-06-29 6 views
3

D'une certaine manière ce code de mise à jour ne fonctionne pas:Toute raison pour laquelle cette requête de mise à jour LINQ to SQL ne fonctionne pas. .

Voici mon code contrôleur:

private UserRepository repo = new UserRepository(); 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(int id, UserInfo user_) 
    { 
     try 
     { 
      repo.UpdateUser(user_); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

Voici le code repo utilisé ci-dessus (UserRepository)

private UsersDataContext db = new UsersDataContext(); 

    public void UpdateUser(UserInfo user_) 
    { 
     UserInfo origUser = GetUser(user_.Id); 
     origUser.First = user_.First; 
     origUser.Last = user_.Last; 
     origUser.City = user_.City; 
     origUser.Country = user_.Country; 
     origUser.State = user_.State; 
     origUser.Street_Address = user_.Street_Address; 

     db.SubmitChanges(); 
    } 

    public UserInfo GetUser(int id_) 
    { 
     return db.UserInfos.SingleOrDefault(d => d.Id == id_); 
    } 

EDIT: Notez que lors du débogage, tout fonctionne correctement (sans exception), mais quand il redirige vers Index, les données n'ont pas été mises à jour lors des modifications de la mise à jour.

+1

Avez-vous essayé d'observer l'exception qu'il attrape? – womp

+0

Pouvez-vous élaborer sur "ne fonctionne pas"? La méthode d'action ne se fait-elle pas virer? La méthode de base de données n'est-elle pas désactivée? Définissez-vous des points d'arrêt et vérifiez-vous le contenu de user_ s'ils le sont? – KingNestor

+0

J'ai mis à jour le post avec ces réponses – leora

Répondre

1

Je viens de modifier le userrepository à ce qui suit:

private UsersDataContext db = new UsersDataContext(); 

public void UpdateUser(UserInfo user_) 
{ 
    UserInfo origUser = db.UserInfos.SingleOrDefault(d => d.Id == id_); 
    origUser.First = user_.First; 
    origUser.Last = user_.Last; 
    origUser.City = user_.City; 
    origUser.Country = user_.Country; 
    origUser.State = user_.State; 
    origUser.Street_Address = user_.Street_Address; 

    db.SubmitChanges(); 
} 

donc tout ce que je ne faisais que déplacer la ligne de la méthode GetUser() et cela a fonctionné.

Cela aurait pu être un faux-fuyant et c'était juste un problème de mise en cache. .

+0

heureux que vous l'avez trouvé, je ne comprends pas pourquoi cela fonctionnerait et votre code précédent ne serait pas. Tout ce que vous avez fait, c'est enlever la fonction enveloppant ce getter ... – Peter

0

Vous ne mentionnez pas comment vous avez défini UserInfo, est-ce une structure ou une classe? Si c'est une structure, le retourner depuis GetUser créera un nouvel objet et ainsi vous ne mettrez pas à jour l'objet de base de données, seulement une copie locale de celui-ci.

Le déplacement du GetUser en ligne évite cette création de copie temporaire et c'est probablement pourquoi cela fonctionne.

afaik vous pourriez faire quelque chose comme

public void GetUser(int id_, out UserInfo user_) 
{ 
    user_ = db.UserInfos.SingleOrDefault(d => d.Id == id_); 
} 

Vous appelleriez alors comme ça

public void UpdateUser(UserInfo user_) 
{ 
    UserInfo origUser; 
    GetUser(user_.Id, out origUser); 
    origUser.First = user_.First; 
    origUser.Last = user_.Last; 
    origUser.City = user_.City; 
    origUser.Country = user_.Country; 
    origUser.State = user_.State; 
    origUser.Street_Address = user_.Street_Address; 

    db.SubmitChanges(); 
} 
0

Peut-être que vous avez désactivé le suivi des objets?

Questions connexes