Просто измените свойство на фиктивное значение, а затем вернитесь ...
var value = obj.SomeField;
obj.SomeField = "dummy";
obj.SomeField = value;
dc.SubmitChanges();
Редактировать: позвольте мне взять это обратно. Отслеживание изменений L2S этим не обманет. Самый простой / чистый / безопасный способ, если вы не хотите изменять какие-либо из существующих столбцов, - это, вероятно, добавить новый столбец и изменить его.
Если вы абсолютно не можете вносить какие-либо изменения в БД (т. Е. Добавлять новый столбец), тогда вариант перехода на трекер изменений с отражением может быть вариантом. Я не пробовал, но похоже, что путь к этому будет (примерно):
1) у datacontext есть личный член, который называется services.
2) сервисы указывают на CommonDataServices, который имеет частный трекер и внутренний член ChangeTracker (возвращающий первый).
3) Отслеживание изменений имеет внутренний метод GetTrackedObject, который возвращает TrackedObject.
4) TrackedObject имеет метод ConvertToModified ...
Редактировать # 2: Я только что проверил маршрут отражения выше, и он, кажется, работает. E.g.:
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);
}
}