2010-12-08 21 views
0

J'essaie de faire ce qui suit avec le cadre de l'entité 4:applyCurrentValues ​​ne semble pas fonctionner

public void Update(Site entity) 
{ 
    using (db) 
    { 
     db.Sites.Attach(db.Sites.Single(s => s.Id == entity.Id)); 
     db.Sites.ApplyCurrentValues(entity); 
     db.SaveChanges(); 
    } 
} 

Mais lorsque je tente de mettre à jour un site grâce à cette méthode que je reçois une erreur me disant que:

La conversion d'un type de données datetime2 en un type de données datetime a abouti à dans une valeur hors limites. L'instruction a été interrompue.

Et cela parce que le site d'origine pour une raison quelconque n'est pas chargé via la méthode Attach().

Quelqu'un peut-il aider avec ceci?

/Martin

+0

Vous n'avez pas besoin de joindre une entité chargée. Si vous utilisez le même contexte, il est déjà attaché. Êtes-vous sûr que vos valeurs actuelles ne remplacent pas certaines valeurs chargées avec DateTime.MinValue? –

+0

Lorsque je supprime la pièce jointe(), j'obtiens l'erreur suivante: "Impossible de trouver un objet avec une clé correspondant à la clé de l'objet fourni dans ObjectStateManager.Vérifiez que les valeurs clés de l'objet fourni correspondent aux valeurs clés de l'objet auquel les modifications doivent être appliquées. " Donc, je pense que l'entité n'est plus dans l'objet ObjectState –

Répondre

3

Vous n'êtes pas obligé de "attacher" quelque chose que vous récupérez déjà (Ladislav est à droite). Une fois que vous récupérez une entité (par exemple SingleOrDefault), il est "dans le graphique" (mémoire EF - il peut donc faire une concurrence optimiste).

Si vous essayez de faire un UPDATE < et la "entité" en passant par votre est nouveau/détaché ...

Essayez la technique stub:

public void Update(Site entity) 
{ 
    using (db) 
    { 
     var stub = new Site { Id = entity.Id }; // create stub with given key 
     db.Sites.Attach(stub); // stub is now in graph 
     db.Sites.ApplyCurrentValues(entity); // override graph (stub) with entity 
     db.SaveChanges(); 
    } 
} 

Cela étant dit, la erreur que vous avez fourni des points à un autre problème (conversion de données).

Avez-vous vérifié les valeurs de "date" que vous passez avec le type de données sur le modèle?

+0

Comme mentionné ci-dessus à Ladislav Mrnka commentaire, je reçois une erreur lorsque j'essaie de supprimer la méthode Attach(). Cependant, quand je fais ce que vous suggérez avec la technique du talon, cela fonctionne. Est-ce que cela a à voir avec le fait que j'utilise EF4 dans Domain Driven Design? –

+0

@ Martin Overgaard - non, il ne le fait pas. Je dois aussi utiliser la technique stub, car j'utilise POCO et ASP.NET MVC (donc mes entités sont détachées du graphe au début de la nouvelle requête - stateless - HTTP). Cela n'a rien à voir avec DDD. C'est requis pour les entités qui sont détachées du contexte, mais vous savez qu'elles existent et vous devez les mettre à jour. C'est une technique d'Alex James. Veuillez cocher cette case comme réponse correcte si elle a résolu votre problème. – RPM1984

0
public ActionResult Edit(int id, Client collection) 
{ 
    try 
    { 
     // make sure the rec is in the context 
     var rec = dbEntities.Clients.First(r => r.ClientID == id); 
     // update the rec in the context with the parm values 
     dbEntities.Clients.ApplyCurrentValues(collection);   
     // make the changes permanent 
     dbEntities.SaveChanges();         
     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(); 
    } 
}