Просто измените свойство фиктивной стоимости, а затем обратно ...
var value = obj.SomeField;
obj.SomeField = "dummy";
obj.SomeField = value;
dc.SubmitChanges();
Edit: позвольте мне считать, что обратно. Отслеживание изменений L2S не будет обмануто этим. Самый простой/чистый/безопасный способ, если вы не хотите менять какой-либо из существующих столбцов, вероятно, должен добавить новый столбец и изменить его.
Если вы абсолютно не можете внести какие-либо изменения в db (т. Е. Добавить новый столбец), то переход к трекеру изменений с отражением может быть вариантом. Я не пробовал, но похоже, что маршрут к нему будет (примерно):
1) у datacontext есть частный член, называемый сервисами.
2) Службы указывают на CommonDataServices, у которого есть отдельный участник-трекер и внутренний член ChangeTracker (возврат первого).
3) Сменные трекеры имеют внутренний метод GetTrackedObject, который возвращает TrackedObject.
4) TrackedObject имеет метод ConvertToModified ...
Edit # 2: Я просто проверял маршрут отражения выше, и это, кажется, работает. Например .:
using (advWorksDataContext dc = new advWorksDataContext())
{
Employees emp = dc.Employees.FirstOrDefault();
dc.MakeDirty(emp);
dc.SubmitChanges();
}
... и реализация MakeDirty является:
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);
}
}
Как насчет вызова Attach (obj, true) в таблице от постоянного тока? –
meandmycode
@meandmycode .Attach (obj, true) будет работать при некоторых обстоятельствах, но не если: a) объект уже прикреплен к datacontext или b) объект отсоединен, но не имеет члена версии (временная метка/rowversion) – KristoferA