当前位置: 首页 > 编程语言 > C#

让Linq对象“变脏”的最干净的方法是什么?Share

时间:2023-04-11 00:23:46 C#

使Linq对象“变脏”的最干净的方法是什么?我有一个MyClass类型的Linq-To-SQL对象obj,我已经通过我的数据上下文加载了它。现在我想强制保存该对象,即使实际上没有更改任何字段,以便保存操作可以在幕后设置一些触发器。让我的数据上下文认为obj是脏的,所以调用SubmitChanges()将导致保存obj的最简单方法是什么?只需将属性更改为虚拟值并返回...varvalue=obj.SomeField;obj.SomeField="虚拟";obj.SomeField=值;dc.SubmitChanges();编辑:让我把它带回来。L2S更改跟踪器不会被这个愚弄。如果您不想更改任何现有列,最简单/最干净/最安全的方法可能是添加一个新列并进行更改。如果您绝对不能对数据库进行任何更改(即添加新列),您可以选择对更改跟踪器使用反射。我没试过,但看起来这是路线(大致):1)DataContext有一个名为services的私有成员。2)Service指向CommonDataServices,它有私有成员Tracker和内部成员ChangeTracker(返回前者)。3)更改跟踪器有一个GetTrackedObject内部方法,它返回一个TrackedObject。4)TrackedObject有一个ConvertToModified方法...编辑#2:我刚刚测试了上面的反射路由,它似乎有效。例如:using(advWorksDataContextdc=newadvWorksDataContext()){Employeesemp=dc.Employees.FirstOrDefault();dc.MakeDirty(emp);dc.SubmitChanges();}……并MakeDirty的实际情况是:while(dcType!=typeof(System.Data.Linq.DataContext)){dcType=dcType.BaseType;}//在DCSystem.Reflection.FieldInfo中获取CommonDataServices东西对象commonDataServices=commonDataServicesField.GetValue(dc);输入commonDataServicesType=commonDataServices.GetType();//获取更改跟踪器System.Reflection.PropertyInfochangeTrackerProperty=commonDataServicesType.GetProperty("ChangeTracker",System.Reflection.BindingFlags.I实例|System.Reflection.BindingFlags.NonPublic);objectchangeTracker=changeTrackerProperty.GetValue(commonDataServices,null);输入changeTrackerType=changeTracker.GetType();//获取跟踪对象方法System.Reflection.MethodInfogetTrackedObjectMethoder("GetTrackedObject",System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.NonPublic);objecttrackedObject=getTrackedObjectMethod.Invoke(changeTracker,newobject[]{someEntity});//获取ConvertToModified方法TypetrackedObjectType=trackGetType();System.Reflection.MethodInfoconvertToModifiedMethod=trackedObjectType.GetMethod("ConvertToModified",System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.NonPublic);//调用转换为修改后的方法vokeconvertToModifiedMethod,tracked.无效的);如果不破坏其他任何东西,你可以尝试2次提交吗?所以你可以使用Kristofer的第一个答案的变体:只需将属性更改为虚拟value,保存,然后改回来...varvalue=obj.SomeField;obj.SomeField="虚拟";dc.SubmitChanges();obj.SomeField=值;dc.SubmitChanges();你有什么好的目标?以上就是C#学习教程:让Linq对象“变脏”的最简洁的方法是什么?分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: