LINQToSQLTransaction浅析

本文向大家介绍LINQ To SQL Transaction,可能好多人还不了解Transaction,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。

创新互联主要从事网站建设、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务隆林,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

不管你是由我的书中,或是MSDN、网站处得知,LINQ to SQL之DataContext于SubmitChanges函式执行时,就算不指定Transaction,DataContext都会自动启动一个 Transaction,在许多ORM中,这算是相当常见的设计。

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

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

 
 
 
  1. using System;  
  2. using System.Data;  
  3. using System.Data.Common;  
  4. using System.Data.SqlClient;  
  5. using System.Collections.Generic;  
  6. using System.Linq;  
  7. using System.Data.Linq;  
  8. using System.Text;  
  9. using System.Reflection;  
  10.    
  11. namespace ConsoleApplication35  
  12. {  
  13. class Program  
  14. {  
  15. static void Main(string[] args)  
  16. {  
  17. NorthwindDataContext context = new NorthwindDataContext();   
  18. var item = (from s1 in context.Customers where s1.CustomerID == "VINET"  
  19. select s1).FirstOrDefault();  
  20. if (item != null)  
  21. item.ContactName = "VINET14";  
  22. Console.ReadLine();  
  23. context.DisableTransaction = true;  
  24. context.SubmitChanges();  
  25. Console.ReadLine();  
  26. }  
  27. }  
  28.    
  29. partial class NorthwindDataContext  
  30. {  
  31. public bool DisableTransaction { get; set; }  
  32.    
  33. private static MethodInfo _checkDispose = null;  
  34. private static MethodInfo _checkNotInSubmitChanges = null;   
  35. private static MethodInfo _verifyTrackingEnabled = null;  
  36. private static MethodInfo _acceptChanges = null;  
  37. private static MethodInfo _submitChanges = null;  
  38. private static FieldInfo _conflicts = null;  
  39. private static FieldInfo _isInSubmitChanges = null;  
  40. private static PropertyInfo _services = null;  
  41. private static Type _changeProcessorType = null;  
  42. private static ConstructorInfo _ci = null;  
  43.    
  44. static NorthwindDataContext()  
  45. {  
  46. _checkDispose = typeof(DataContext).GetMethod("CheckDispose",  
  47.  BindingFlags.NonPublic | BindingFlags.Instance);  
  48. _checkNotInSubmitChanges =  
  49.  typeof(DataContext).GetMethod("CheckNotInSubmitChanges",  
  50. BindingFlags.NonPublic | BindingFlags.Instance);  
  51. _verifyTrackingEnabled = typeof(DataContext).GetMethod("VerifyTrackingEnabled",  
  52. BindingFlags.NonPublic | BindingFlags.Instance);  
  53. _acceptChanges = typeof(DataContext).GetMethod("AcceptChanges",  
  54.  BindingFlags.NonPublic | BindingFlags.Instance);  
  55. _conflicts = typeof(DataContext).GetField("conflicts",  
  56. BindingFlags.NonPublic | BindingFlags.Instance);  
  57. _isInSubmitChanges = typeof(DataContext).GetField("isInSubmitChanges",  
  58.  BindingFlags.NonPublic | BindingFlags.Instance);  
  59. _changeProcessorType = typeof(DataContext).Assembly.GetType(  
  60.  "System.Data.Linq.ChangeProcessor");  
  61. _services = typeof(DataContext).GetProperty("Services",  
  62. BindingFlags.NonPublic | BindingFlags.Instance);  
  63. _ci = _changeProcessorType.GetConstructor(  
  64.  BindingFlags.NonPublic | BindingFlags.Instance, null,  
  65. new Type[]  
  66. { typeof(DataContext).Assembly.GetType("System.Data.Linq.CommonDataServices"),  
  67. typeof(DataContext) }, null);  
  68. _submitChanges = _changeProcessorType.GetMethod("SubmitChanges",  
  69.  BindingFlags.NonPublic | BindingFlags.Instance);  
  70. }  
  71.    
  72. public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)   
  73. {  
  74. if (DisableTransaction)  
  75. {  
  76. _checkDispose.Invoke(this, null);  
  77. _checkNotInSubmitChanges.Invoke(this, null);  
  78. _verifyTrackingEnabled.Invoke(this, null);  
  79. ((ChangeConflictCollection)_conflicts.GetValue(this)).Clear();  
  80. try  
  81. {  
  82. _isInSubmitChanges.SetValue(this, true);  
  83. object processor = _ci.Invoke(new object[]  
  84.  { _services.GetValue(this, null), this });  
  85. _submitChanges.Invoke(processor, new object[] { failureMode });  
  86. _acceptChanges.Invoke(this, null);  
  87. }  
  88. finally  
  89. {  
  90. _isInSubmitChanges.SetValue(this, false);  
  91. }  
  92. }  
  93. else  
  94. base.SubmitChanges(failureMode);  
  95. }  
  96. }  

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

新闻标题:LINQToSQLTransaction浅析
当前路径:http://www.shufengxianlan.com/qtweb/news46/265346.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联