Nur eine Eigenschaft auf einen Dummy-Wert ändern und dann zurück ...
var value = obj.SomeField;
obj.SomeField = "dummy";
obj.SomeField = value;
dc.SubmitChanges();
Edit: lassen Sie mich das zurück zu nehmen. Der L2S Change Tracker wird dadurch nicht getäuscht. Der einfachste/sauberste/sicherste Weg, wenn Sie keine der vorhandenen Spalten ändern möchten, ist wahrscheinlich, eine neue Spalte hinzuzufügen und diese zu ändern.
Wenn Sie absolut keine db-Änderungen vornehmen können (d. H. Eine neue Spalte hinzufügen), dann ist es möglicherweise eine Option, den Change-Tracker mit Reflektion aufzurufen. Ich habe es nicht versucht, aber es sieht so aus, als wäre der Weg dahin (ungefähr):
1) der datacontext hat ein privates Mitglied namens services.
2) Dienste zeigt auf eine CommonDataServices, die eine private Member-Tracker und ein internes Mitglied ChangeTracker (die ehemalige zurückgibt).
3) Tracker ändern verfügt über eine interne Methode GetTrackedObject, die ein verfolgtes Objekt zurückgibt.
4) TrackedObject eine ConvertToModified Methode hat ...
Edit # 2: Getestet habe ich nur die Reflexion Weg über und es scheint zu funktionieren. Z.B .:
using (advWorksDataContext dc = new advWorksDataContext())
{
Employees emp = dc.Employees.FirstOrDefault();
dc.MakeDirty(emp);
dc.SubmitChanges();
}
... und die Umsetzung von MakeDirty ist:
public static class DCExtensions
{
internal static void MakeDirty(this System.Data.Linq.DataContext dc, object someEntity)
{
//get dc type
Type dcType = dc.GetType();
while (dcType != typeof(System.Data.Linq.DataContext))
{
dcType = dcType.BaseType;
}
//get hold of the CommonDataServices thing in the DC
System.Reflection.FieldInfo commonDataServicesField
= dcType.GetField("services", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
object commonDataServices = commonDataServicesField.GetValue(dc);
Type commonDataServicesType = commonDataServices.GetType();
//get hold of the change tracker
System.Reflection.PropertyInfo changeTrackerProperty
= commonDataServicesType.GetProperty("ChangeTracker", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
object changeTracker = changeTrackerProperty.GetValue(commonDataServices, null);
Type changeTrackerType = changeTracker.GetType();
//get the tracked object method
System.Reflection.MethodInfo getTrackedObjectMethod
= changeTrackerType.GetMethod("GetTrackedObject", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
object trackedObject = getTrackedObjectMethod.Invoke(changeTracker, new object[] { someEntity });
//get the ConvertToModified method
Type trackedObjectType = trackedObject.GetType();
System.Reflection.MethodInfo convertToModifiedMethod
= trackedObjectType.GetMethod("ConvertToModified", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
//call the convert to modified method
convertToModifiedMethod.Invoke(trackedObject, null);
}
}
Wie wäre es mit Berufung Attach (obj, wahr) auf dem Tisch von der dc? –
meandmycode
@meandmycode .Attach (obj, true) würde unter bestimmten Umständen funktionieren, aber nicht wenn: a) das Objekt bereits an den Datenkontext angehängt ist oder b) das Objekt ist detached aber hat keine Versionsmember (timestamp/rowversion) – KristoferA