2010-05-31 8 views
0

Je rencontre quelques problèmes lors de la mise à jour d'une ligne dans ma base de données à l'aide de Linq2Sql.Mise à jour de la ligne de base de données à partir du modèle

À l'intérieur de mon modèle, j'ai deux méthodes de mise à jour et d'enregistrement de mon contrôleur, qui à son tour reçoit un modèle mis à jour de ma vue.

Mes méthodes de modèle comme comme:

public void Update(Activity activity) 
{ 
    _db.Activities.InsertOnSubmit(activity); 
} 


public void Save() 
{ 
    _db.SubmitChanges(); 
} 

et le code dans mon contrôleur aime comme:

[HttpPost] 
public ActionResult Edit(Activity activity) 
{ 
    if (ModelState.IsValid) 
    { 
     UpdateModel<Activity>(activity); 
     _activitiesModel.Update(activity); 
     _activitiesModel.Save(); 
    } 
    return View(activity); 
} 

Le problème que je vais avoir est que ce code insère une nouvelle entrée dans la base de données , même si l'élément de modèle que j'insère-sur-submit contient un champ de clé primaire.

J'ai également essayé de rattacher l'objet de modèle à la source de données mais cela génère une erreur car l'élément existe déjà.

Tous les pointeurs dans la bonne direction seront grandement appréciés.

MISE À JOUR:

J'utilise l'injection de dépendance à instancier mon objet DataContext comme suit:

IMyDataContext _db; 

public ActivitiesModel(IMyDataContext db) 
{ 
    _db = db; 
} 
+0

Je peux être complètement incorrect, mais je vais deviner que le problème réside dans la façon dont votre datacontext instancié. – Ahmad

+0

Salut Ahman. Mon contexte de données est instancié à l'aide de DI. Je vais mettre à jour ma question avec le code d'instanciation. –

+0

Bien qu'utilisant DI, quel est le style de vie du datacontext, transitoire, singleton, par-web-request etc. Il se peut que le style de vie par défaut de votre conteneur DI choisi est en vigueur, sauf si vous l'avez spécifié.Je prends une estimation ici :) – Ahmad

Répondre

0

J'ai corrigé ce problème en obtenant et en mettant à jour mon objet dans la méthode Update.

Au lieu d'essayer de rattacher ou d'obtenir le contexte de données pour le réaliser était le même objet qui appartenait avant essentiellement fait comme suit:

[HttpPost] 
public ActionResult Edit(Activity activity) 
{ 
    Activity myActivity = activitiesModel.getActivityById(activity.id); 
    myActivity.name = activity.name; 
    myActivity.date = activity.date; 
    _dbContext.SubmitChanges(); 
    return View(activity); 
} 

Ce n'est pas mon code exact et être plus précis, j'ai créé une autre classe partielle à mon datacontext et stocké mon code de mise à jour là-bas.

0

Il devrait y avoir un insert en cas de l'utilisation de la méthode InsertOnSubmit, cela est un attendu comportement.
Nous recommandons l'utilisation de la méthode Attach() dans votre implémentation de la méthode Update(). Dans le cas où vous avez une colonne IsVersion dans l'entité, tout est simple, dans l'autre cas, vous devrez également transmettre les valeurs d'origine à l'appel Attach. Plus d'informations sont disponibles here in MSDN.

Questions connexes