2010-11-08 5 views
4

Pour mon objet LINQ Foo, je souhaite avoir un état "avant-après" entre ma mutation d'objet (provenant d'un appel ASP.NET MVC UpdateModel()). Mon idée était de copier les propriétés de pré-mutation de l'instance attachée dans une nouvelle instance non attachée. Ensuite, je serais en mesure de faire les mises à jour dans l'instance attachée et de comparer leurs valeurs par rapport à celles de l'instance non attachée. Comme si:Éviter l'enregistrement d'objet dans LINQ

Foo real = context.Foos.First(aFoo => aFoo.ID == id) 
Foo old = new Foo(); 
old.Bar = real.Bar; 
old.Baz = real.Baz; 
SomeSortOfUpdate(real); 
if (!real.Bar.Equals(old.Bar) || real.Baz.Equals(old.Baz)) { 
    LogChanges(old, real); 
} 
context.SubmitChanges(); 

Voici le problème: l'objet référencé par « Foo vieux » est sauvées (inséré) pendant context.SubmitChanges(). J'ai retracé cela à l'affectation des propriétés qui étaient des associations LINQ-to-SQL.

Ainsi, par exemple, si Baz était un type L2S généré table soutenue, y compris old.Baz = real.Baz causerait un insert SQL pour old en plus de toute mise à jour de SQL pour real. Le retirer (mais en gardant old.Bar) fait fonctionner les choses comme je l'espère.

Je suppose que c'est parce que l'affectation Foo.Baz fait un lien entre Foo et Baz dans le graphe d'objet sauvegardable. Comme real est enregistré, LINQ parcourt également tous les objets associés et recherche les modifications. real.Baz n'est pas lui-même modifié, mais il a une nouvelle association à old, qui n'est pas encore enregistré et est donc pris dans l'appel SubmitChanges.

Est-il possible que empêche objets dans le graphique d'être enregistré?

Répondre

-1

Je me demande ce que cela ferait

var old = (Foo)real; 

Je me demande si l'instance crée elle-même la connexion

+0

Non, cela fait juste une autre référence à la même instance. Cela ne servirait pas à mes fins de déterminer les différences entre les anciens et les nouveaux États. –

2

Votre analyse est correcte. Vos devoirs établissent des liens.

Vous pouvez modifier le code généré pour ne pas le faire (ou écrivez le vôtre). Mais cela signifie que vous devez vivre sans classes d'entités générées automatiquement. Personnellement, je considère que c'est inacceptable. Pourquoi ne sérialiseriez-vous pas l'objet pré-image dans un dictionnaire, pourquoi? Ou copier ses valeurs de propriété dans une classe DTO personnalisée?

À partir de votre code, je peux dire que vous voulez que les anciennes valeurs modifient la journalisation. Vous pouvez le faire en utilisant

DataContext.GetTable<T>().GetModifiedMembers(entity)