这里介绍LINQ To SQL Transaction,如果我不想要这个预设的LINQ To SQL Transaction呢?原因有很多,可能是为了减少Lock的时间,或是效能、资源等等,反正就是不想要这个预设行为就是了!只要简简单单的更新资料就好了。
本文向我们介绍LINQ To SQL Transaction,或许好多人还不了解Transaction,没有关系,看完本文你必定有不少收成,期望本文能教会你更多东西。
不论你是由我的书中,或是MSDN、网站处得知,LINQ To SQL之DataContext于SubmitChanges函式执行时,就算不指定Transaction,DataContext都会主动发动一个 Transaction,在许多ORM中,这算是适当常见的规划。
不过,假如我不想要这个预设的LINQ To SQL Transaction呢?原因有许多,或许是为了削减Lock的时刻,或是效能、资源等等,横竖便是不想要这个预设行为便是了!只需简简单单的更新材料就好了。
或许吗?就现在的LINQ To SQL规划来说,这个行为是强制性的,且无可调整之空间,但!若要强渡关山也不是没交通工具,DataContext开了一个小口,让我们能够覆载 SubmitChanges函式,以此为起点,我利用了很多的Reflection技巧,让Transaction消失。
- usingSystem;
- usingSystem.Data;
- usingSystem.Data.Common;
- usingSystem.Data.SqlClient;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Data.Linq;
- usingSystem.Text;
- usingSystem.Reflection;
- namespaceConsoleApplication35
- {
- classProgram
- {
- staticvoidMain(string[]args)
- {
- NorthwindDataContextcontext=newNorthwindDataContext();
- varitem=(froms1incontext.Customerswheres1.CustomerID=="VINET"
- selects1).FirstOrDefault();
- if(item!=null)
- item.ContactName="VINET14";
- Console.ReadLine();
- context.DisableTransaction=true;
- context.SubmitChanges();
- Console.ReadLine();
- }
- }
- partialclassNorthwindDataContext
- {
- publicboolDisableTransaction{get;set;}
- privatestaticMethodInfo_checkDispose=null;
- privatestaticMethodInfo_checkNotInSubmitChanges=null;
- privatestaticMethodInfo_verifyTrackingEnabled=null;
- privatestaticMethodInfo_acceptChanges=null;
- privatestaticMethodInfo_submitChanges=null;
- privatestaticFieldInfo_conflicts=null;
- privatestaticFieldInfo_isInSubmitChanges=null;
- privatestaticPropertyInfo_services=null;
- privatestaticType_changeProcessorType=null;
- privatestaticConstructorInfo_ci=null;
- staticNorthwindDataContext()
- {
- _checkDispose=typeof(DataContext).GetMethod("CheckDispose",
- BindingFlags.NonPublic|BindingFlags.Instance);
- _checkNotInSubmitChanges=
- typeof(DataContext).GetMethod("CheckNotInSubmitChanges",
- BindingFlags.NonPublic|BindingFlags.Instance);
- _verifyTrackingEnabled=typeof(DataContext).GetMethod("VerifyTrackingEnabled",
- BindingFlags.NonPublic|BindingFlags.Instance);
- _acceptChanges=typeof(DataContext).GetMethod("AcceptChanges",
- BindingFlags.NonPublic|BindingFlags.Instance);
- _conflicts=typeof(DataContext).GetField("conflicts",
- BindingFlags.NonPublic|BindingFlags.Instance);
- _isInSubmitChanges=typeof(DataContext).GetField("isInSubmitChanges",
- BindingFlags.NonPublic|BindingFlags.Instance);
- _changeProcessorType=typeof(DataContext).Assembly.GetType(
- "System.Data.Linq.ChangeProcessor");
- _services=typeof(DataContext).GetProperty("Services",
- BindingFlags.NonPublic|BindingFlags.Instance);
- _ci=_changeProcessorType.GetConstructor(
- BindingFlags.NonPublic|BindingFlags.Instance,null,
- newType[]
- {typeof(DataContext).Assembly.GetType("System.Data.Linq.CommonDataServices"),
- typeof(DataContext)},null);
- _submitChanges=_changeProcessorType.GetMethod("SubmitChanges",
- BindingFlags.NonPublic|BindingFlags.Instance);
- }
- publicoverridevoidSubmitChanges(System.Data.Linq.ConflictModefailureMode)
- {
- if(DisableTransaction)
- {
- _checkDispose.Invoke(this,null);
- _checkNotInSubmitChanges.Invoke(this,null);
- _verifyTrackingEnabled.Invoke(this,null);
- ((ChangeConflictCollection)_conflicts.GetValue(this)).Clear();
- try
- {
- _isInSubmitChanges.SetValue(this,true);
- objectprocessor=_ci.Invoke(newobject[]
- {_services.GetValue(this,null),this});
- _submitChanges.Invoke(processor,newobject[]{failureMode});
- _acceptChanges.Invoke(this,null);
- }
- finally
- {
- _isInSubmitChanges.SetValue(this,false);
- }
- }
- else
- base.SubmitChanges(failureMode);
- }
- }
- }
处理完毕,我个人是觉得,应该把LINQ To SQL Transaction以Session概念处理,如Hibernate。
【修改引荐】
- LINQ Customers类归纳
- LINQ查询操作全面分析
- LINQ to SQL的Table分析
- Linq数据分组全面描绘
- LINQ查询根底归纳