zoukankan      html  css  js  c++  java
  • 更新自己,不要影响其他人

    最近围绕着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 (修改前读取的数据)

    imageimage (利用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。(不说了)

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

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

    邮箱:james@taogame.com
    QQ:785418
    微信:jamesying1
    QQ群:376248054 通关:cnblogs
    技术改变生活,技术改变人生!用技术来创造价值,拥有技术,不仅仅是开发,您将获得更多!如果您觉得我能帮到您,您可以通过扫描下面二维码来【捐助】我!
  • 相关阅读:
    hdu 1290 献给杭电五十周年校庆的礼物 (DP)
    hdu 3123 GCC (数学)
    hdu 1207 汉诺塔II (DP)
    hdu 1267 下沙的沙子有几粒? (DP)
    hdu 1249 三角形 (DP)
    hdu 2132 An easy problem (递推)
    hdu 2139 Calculate the formula (递推)
    hdu 1284 钱币兑换问题 (DP)
    hdu 4151 The Special Number (DP)
    hdu 1143 Tri Tiling (DP)
  • 原文地址:https://www.cnblogs.com/inday/p/1765187.html
Copyright © 2011-2022 走看看