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é?
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. –