2010-07-26 15 views
1

Je commence tout juste à travailler avec LINQ, et je suis assez familier avec MVC. J'ai une vue fortement typée qui met à jour un enregistrement. Je l'ai fait avec succès une création:Problème de liaison de modèle dans LINQ to SQL

Cela fonctionne bien, et crée un enregistrement dans la base de données:

public ActionResult Create(TABLEMODEL tableModel) 
{ 
    DBDataContext db = new DBDataContext(); 
    if (ModelState.IsValid) 
    { 
     db.TABLEMODEL.InsertOnSubmit(tableModel); 
     db.SubmitChanges(); 
    } 
} 

Mais en essayant de mettre à jour:

public ActionResult Manage(TABLEMODEL tableModel) 
{ 
    DBDataContext db = new DBDataContext(); 
    if (ModelState.IsValid) 
    { 
     db.SubmitChanges(); 
    } 
} 

Cela échoue, dans le sens où il ne met pas à jour l'enregistrement dans la base de données. Aucune erreur/exception réelle ne se produit, et je peux passer à travers cela très bien.

Je suis sûr qu'il me manque quelque chose, mais je ne trouve pas quoi. J'apprécie toute aide à ce sujet.

MISE À JOUR
J'ai remarqué que si je reçois un enregistrement en utilisant le DataContext:

DBDataContext db = new DBDataContext(); 
var m = db.TABLEMODELs.Single(m => m.ID == 1); 
m.Name = "UpdatedName"; 
db.SubmitChanges(); 

Cela ne mise à jour, donc je suppose que je suis en quelque sorte pas de mon modèle de fixation au contexte LINQ.

Ma solution
Je trouve que vous devez récupérer l'objet, puis mettre à jour que la forme. Assez simple.

[HttpPost] 
public ActionResult Manage(int ID, FormCollection form) 
{ 
    DBSDataContext db = new DBSDataContext(); 
    var t= db.TABLEMODELs.Single(b => b.ID == ID); 
    UpdateModel(t); 
    if (ModelState.IsValid) 
    { 
     db.SubmitChanges(); 
    } 
    return View(t); 
} 
+1

Quel est le message d'erreur? Qu'est ce qui échoue? Le code compile et s'exécute mais aucune mise à jour n'est faite dans la base de données? –

+0

Aucune erreur, ne pas commettre. Question éditée pour refléter ceci. Merci –

Répondre

2

Vous devriez ré-interroger le d'origine tableModel, la carte la ligne mise à jour et mise à jour.

Peut-être quelque chose comme ça (exemple seulement, ne sachant pas quoi que ce soit au sujet de votre schéma):

var originalTableModel = db.GetById(tableModel.Id); 
originalTableModel.FirstName = tableModel.FirstName; 
db.SubmitChanges(); 
+0

J'ai beaucoup de propriétés qui sont en cours de modification, dois-je vraiment faire avec toutes les propriétés? On dirait que cela rendrait la liaison du modèle inutile. Je pourrais juste assigner les valeurs de formulaire aux nouvelles propriétés de modèle. –

+0

En outre, je n'ai pas une méthode GetById de mon datacontext. Est-ce normal? –

+0

Vous devriez au moins avoir une clé primaire ... (souvent "Id" mais pourrait être n'importe quel autre champ qui identifiera de façon unique une ligne de table). Pour la cartographie complexe, je suggère de regarder "AutoMapper" (http://automapper.codeplex.com/) qui peut éliminer une grande partie du code d'affectation côté gauche/côté droit. Mais peut-être obtenir plus comfotable avec le flux de travail des opérations LINQ CRUD utilisant des tables siimple, puis étudier les modèles de type Automapper et Repository lorsque vous vous sentez plus à l'aise avec les bases. – JcMaltaDev