更新自己,不要影响其他人

系统 1484 0

最近围绕着c++和C#的讨论越来越激烈,firelong努力着证明自己的观点,园子里一些大大们也在激烈的辩证着,作为小鸟的我,旁观,看看一笑而过吧。

其实无论哪种语言,肯定有它的优势和劣势,我们何必去争个你死我活呢?我承认firelong有些观点正确,但这些会影响我们吗?我相信有一定基础的程序员,都不会去在意,因为我们选择的不仅仅是语言,或许还有更多,如果单单靠某些人的一些观点,我们就改变了,那也太没立场了,变成墙头草了不是?

但我很喜欢看这种讨论,因为firelong把自己的观点,例子举了出来,而不是理论上的进行驳斥,这种文章看出来是作者用心实践过的,我们应该支持,对于那种没有实践,只是一再的崇拜或者诋毁的人,出来就是辱骂的,大家一起来鄙视下吧。

今天不是为了参与讨论,正好今天遇到了个问题(其实一直懒得解决),符合了标题,随便说说,说的难听了,大家见谅,笑笑而过吧。

问题其实很简单,更新静态变量的值,而这个值呢,又是从linq to sql中获取的,大概的结构如下:

    
    
    
      public class 
    
    
      MyConfig

    
    
    
      {

        
    
    
      private static 
    
    
      DataLoader 
    
    
      s_loader;



        
    
    
      static 
    
    
      MyConfig()

        {

            s_loader = 
    
    
      new 
    
    
      DataLoader
    
    
      ();

        }



        
    
    
      public static 
    
    
      List
    
    
      <
    
    
      Company
    
    
      > AllCompanies

        {

            
    
    
      get

            
    
    
      {

                
    
    
      return 
    
    
      s_loader.GetAllCompanies();

            }

        }



        
    
    
      public static 
    
    
      List
    
    
      <
    
    
      MyType
    
    
      > AllTypes

        {

            
    
    
      get

            
    
    
      {

                
    
    
      return 
    
    
      s_loader.GetAllTypes();

            }

        }

    }
    
  

 

简单的一个获取配置信息的一个类(这是举例用的,实际使用中并不是这样)。

DataLoader 是与数据库相关的一个操作类,主要是通过linq to sql 来获取数据库中的信息。

代码:

    
      public class 
    
    
      DataLoader

    
    
    
      {

        
    
    
      public 
    
    
      DataLoader()

        {


    
    
              }



        
    
    
      DataClasses1DataContext 
    
    
      context = 
    
    
      new 
    
    
      DataClasses1DataContext
    
    
      ();



        
    
    
      internal 
    
    
      List
    
    
      <
    
    
      MyType
    
    
      > GetAllTypes()

        {

            

            
    
    
      return 
    
    
      context.MyType.ToList();

        }



        
    
    
      internal 
    
    
      List
    
    
      <
    
    
      Company
    
    
      > GetAllCompanies()

        {

            
    
    
      return 
    
    
      context.Company.ToList();

        }

    }
    
  

代码丑了点,见谅见谅,主要的目的只有2个,获取所有类型和获取所有公司。

实际运用在了web项目中,又有另外一个后台专门来修改数据,这时候就出现了一个问题,默认情况下,linq to sql 会从缓存中获取数据。

操作步骤如下:循环读取MyType-》无论利用什么方法,修改数据库的MyType值-》再次读取。

因为用了命令行项目来实验的,那必须修改前和修改后都不能关闭命令行程序。以下简单的测试代码:

    
    
    
      static void 
    
    
      Main(
    
    
      string
    
    
      [] args)

        {

            
    
    
      var 
    
    
      key = 
    
    
      String
    
    
      .Empty;

            
    
    
      while 
    
    
      (key != 
    
    
      "quit"
    
    
      )

            {

                key = 
    
    
      Console
    
    
      .ReadLine();

                
    
    
      MyConfig
    
    
      .AllTypes.ForEach(c => 
    
    
      Console
    
    
      .WriteLine(c.Title));

                
    
    
      MyConfig
    
    
      .AllCompanies.ForEach(c => 
    
    
      Console
    
    
      .WriteLine(c.Name));

            }



            
    
    
      Console
    
    
      .WriteLine(
    
    
      "program to quit..."
    
    
      );

            
    
    
      //Console.ReadLine();

        
    
    
      }
    
  

测试很简单,只要不输入quit,每次都会输出类型标题和公司名称。看下前后结果:

image (修改前读取的数据)

image image (利用Sql Manager Studio修改数据)

  image (修改后读取的数据)

 

看到了,这就是linq to sql 的缓存造成的结果,为了避免这个情况,我们可以使用以下方法:

1、把DataContext.ObjectTrackingEnabled属性设置为false

     因为linq to sql获取数据缓存的时候,先检索标识是否改变,如果未改变,则会用缓存中的数据。而ObjectTrackingEnabled设为false后,会关闭标识管理和变化跟踪,那样每次获取都会是最新的数据。(以下是重新测试结果,测试前数据恢复)

image     ----   image

目的是达到了,我们知道关闭ObjectTrackingEnabled属性,是一个好的提升性能的方式,但有时候也会造成一定的麻烦,比如更新、比如我要获取一对多,多对多的对象时。(其实是自己一开始没注意到,等改了以后发现项目中。。。。已经惨不忍睹了,绿一下自己)。

2、DataContext.Refresh方法。

      使用指定方法刷新实体对象(摘自msdn)。使用它以后,我能更新自己,而不影响其他人了。Refresh的方法,大家可以看msdn,我就写下代码吧,代码只修改了获取类型的方法。

    
      internal 
    
    
      List
    
    
      <
    
    
      MyType
    
    
      > GetAllTypes()

        {

            
    
    
      var 
    
    
      types = context.MyType.ToList();



            context.Refresh(
    
    
      RefreshMode
    
    
      .KeepChanges, types);



            
    
    
      return 
    
    
      types;

        }
    
  

我们再测试下(数据恢复先,直接上结果了):

image

实验成功,获取到了最新的MyType值,而公司的值则是修改前的,当然在程序下次运行的时候,就会变成最新的了。

3、重新实例化DataContext。(不说了)

 

以上东东纯属乱写,只是自己遇到的一个问题,可能写的不好,大家也不要拼命砸砖哦。

 

再说说最近的激辩吧,大家也不要辩论什么了,只要做好自己,努力提高自己就好,我们在实际应用中,会遇到许许多多的项目,每个项目的开始,都会商量好用什么语言来写,什么框架来建,不要为了哪个语言好哪个语言不好去争个不休,每个项目都会有不同的需求,用最适合的而不是用最好的,那就行了。

更新自己,不要影响其他人


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论