这里介绍LINQ To SQL Transaction,如果我不想要这个预设的LINQ To SQL Transaction呢?原因有很多,可能是为了减少Lock的时间,或是效能、资源等等,反正就是不想要这个预设行为就是了!只要简简单单的更新资料就好了。

本文向我们介绍LINQ To SQL Transaction,或许好多人还不了解Transaction,没有关系,看完本文你必定有不少收成,期望本文能教会你更多东西。

LINQ To SQL Transaction浅析(LINQ to SQL)  Transact 第1张

不论你是由我的书中,或是MSDN、网站处得知,LINQ To SQL之DataContext于SubmitChanges函式执行时,就算不指定Transaction,DataContext都会主动发动一个 Transaction,在许多ORM中,这算是适当常见的规划。

不过,假如我不想要这个预设的LINQ To SQL Transaction呢?原因有许多,或许是为了削减Lock的时刻,或是效能、资源等等,横竖便是不想要这个预设行为便是了!只需简简单单的更新材料就好了。

或许吗?就现在的LINQ To SQL规划来说,这个行为是强制性的,且无可调整之空间,但!若要强渡关山也不是没交通工具,DataContext开了一个小口,让我们能够覆载 SubmitChanges函式,以此为起点,我利用了很多的Reflection技巧,让Transaction消失。

  1. usingSystem;
  2. usingSystem.Data;
  3. usingSystem.Data.Common;
  4. usingSystem.Data.SqlClient;
  5. usingSystem.Collections.Generic;
  6. usingSystem.Linq;
  7. usingSystem.Data.Linq;
  8. usingSystem.Text;
  9. usingSystem.Reflection;
  10. namespaceConsoleApplication35
  11. {
  12. classProgram
  13. {
  14. staticvoidMain(string[]args)
  15. {
  16. NorthwindDataContextcontext=newNorthwindDataContext();
  17. varitem=(froms1incontext.Customerswheres1.CustomerID=="VINET"
  18. selects1).FirstOrDefault();
  19. if(item!=null)
  20. item.ContactName="VINET14";
  21. Console.ReadLine();
  22. context.DisableTransaction=true;
  23. context.SubmitChanges();
  24. Console.ReadLine();
  25. }
  26. }
  27. partialclassNorthwindDataContext
  28. {
  29. publicboolDisableTransaction{get;set;}
  30. privatestaticMethodInfo_checkDispose=null;
  31. privatestaticMethodInfo_checkNotInSubmitChanges=null;
  32. privatestaticMethodInfo_verifyTrackingEnabled=null;
  33. privatestaticMethodInfo_acceptChanges=null;
  34. privatestaticMethodInfo_submitChanges=null;
  35. privatestaticFieldInfo_conflicts=null;
  36. privatestaticFieldInfo_isInSubmitChanges=null;
  37. privatestaticPropertyInfo_services=null;
  38. privatestaticType_changeProcessorType=null;
  39. privatestaticConstructorInfo_ci=null;
  40. staticNorthwindDataContext()
  41. {
  42. _checkDispose=typeof(DataContext).GetMethod("CheckDispose",
  43. BindingFlags.NonPublic|BindingFlags.Instance);
  44. _checkNotInSubmitChanges=
  45. typeof(DataContext).GetMethod("CheckNotInSubmitChanges",
  46. BindingFlags.NonPublic|BindingFlags.Instance);
  47. _verifyTrackingEnabled=typeof(DataContext).GetMethod("VerifyTrackingEnabled",
  48. BindingFlags.NonPublic|BindingFlags.Instance);
  49. _acceptChanges=typeof(DataContext).GetMethod("AcceptChanges",
  50. BindingFlags.NonPublic|BindingFlags.Instance);
  51. _conflicts=typeof(DataContext).GetField("conflicts",
  52. BindingFlags.NonPublic|BindingFlags.Instance);
  53. _isInSubmitChanges=typeof(DataContext).GetField("isInSubmitChanges",
  54. BindingFlags.NonPublic|BindingFlags.Instance);
  55. _changeProcessorType=typeof(DataContext).Assembly.GetType(
  56. "System.Data.Linq.ChangeProcessor");
  57. _services=typeof(DataContext).GetProperty("Services",
  58. BindingFlags.NonPublic|BindingFlags.Instance);
  59. _ci=_changeProcessorType.GetConstructor(
  60. BindingFlags.NonPublic|BindingFlags.Instance,null,
  61. newType[]
  62. {typeof(DataContext).Assembly.GetType("System.Data.Linq.CommonDataServices"),
  63. typeof(DataContext)},null);
  64. _submitChanges=_changeProcessorType.GetMethod("SubmitChanges",
  65. BindingFlags.NonPublic|BindingFlags.Instance);
  66. }
  67. publicoverridevoidSubmitChanges(System.Data.Linq.ConflictModefailureMode)
  68. {
  69. if(DisableTransaction)
  70. {
  71. _checkDispose.Invoke(this,null);
  72. _checkNotInSubmitChanges.Invoke(this,null);
  73. _verifyTrackingEnabled.Invoke(this,null);
  74. ((ChangeConflictCollection)_conflicts.GetValue(this)).Clear();
  75. try
  76. {
  77. _isInSubmitChanges.SetValue(this,true);
  78. objectprocessor=_ci.Invoke(newobject[]
  79. {_services.GetValue(this,null),this});
  80. _submitChanges.Invoke(processor,newobject[]{failureMode});
  81. _acceptChanges.Invoke(this,null);
  82. }
  83. finally
  84. {
  85. _isInSubmitChanges.SetValue(this,false);
  86. }
  87. }
  88. else
  89. base.SubmitChanges(failureMode);
  90. }
  91. }
  92. }

处理完毕,我个人是觉得,应该把LINQ To SQL Transaction以Session概念处理,如Hibernate。

【修改引荐】

  1. LINQ Customers类归纳
  2. LINQ查询操作全面分析
  3. LINQ to SQL的Table分析
  4. Linq数据分组全面描绘
  5. LINQ查询根底归纳
转载请说明出处
知优网 » LINQ To SQL Transaction浅析(LINQ to SQL)

发表评论

您需要后才能发表评论