最近学习Linq to SQL,发现问题如下:    class Program
    {
        static void Main(string[] args)
        {
            NorthWindDataContext db = new NorthWindDataContext();
            Shippers ship = (from s in db.Shippers where s.ShipperID == 1 select s).Single<Shippers>();
            ship.CompanyName = "liwei";
            db.SubmitChanges();
        }
    }    对于上述代码,运行后CompanyName 会修改为liwei,而如果修改代码如下:    public partial class NorthWindDataContext : System.Data.Linq.DataContext
    {
        partial void  UpdateShippers(Shippers instance)
        {
            Console.WriteLine("Updating...");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            NorthWindDataContext db = new NorthWindDataContext();
            Shippers ship = (from s in db.Shippers where s.ShipperID == 1 select s).Single<Shippers>();
            ship.CompanyName = "liwei";
            db.SubmitChanges();
        }
    }    则程序只会显示Updating...而不会进行实质性的修改。
    两段代码的区别只是后者引入了局部方法。但似乎DataContext在执行局部方法时就不再执行数据库操作部分的代码了:即DataContext似乎可以判断局部代码是否被执行了,请问这是怎么做到的?另外,请问高手为什么要这么设计,即为什么要用局部方法的方式来实现,我觉得用重载似乎更直接啊?

解决方案 »

  1.   

    局部方法(partial method)及其特点你理解的局部方法是错的,他和分部类根本不一样.....你的方法会完全覆盖linq生成的局部方法实现....
      

  2.   

    你好,看了你给的帖子了。但是还是不明白。你说“你的方法会完全覆盖linq生成的局部方法实现”那么我的理解是linq to sql生成了一个缺省的局部方法,用于访问数据库。之后我的实现会把这个linq to sql的实现覆盖掉,用于打印“updating...”。感觉有点像重载。局部方法能重载吗?它不是缺省是private的吗?能不能给出一个重载局部方法的例子呢?
      

  3.   

    关于部分方法,我的理解就是,它分为两个部分:(1)方法的声明(2)方法的实现,
    楼主的重载意思是?
    我这里有个代码:namespace ConsoleApp
    {
       public partial class Student
       {
           public string name {private set; get; }
           partial void getNameInfo();//方法声明
           partial void getNameInfo(string name);//方法声明
           public void test()
           {
               this.getNameInfo("cheng");
           }
       }
    }然后在Main方法中实现:namespace ConsoleApp
    {
        public partial class Student 
        {
           partial void getNameInfo()
            {
                Console.WriteLine("Part1");
            }
        }
        public partial class Student
        {
            partial void getNameInfo(string name)
            {
                Console.WriteLine(name);
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Student std = new Student();
                std.test();
                Console.Read();
            }
        }
    }
      

  4.   

    楼主的代码,Linq to Sql中只有方法的声明:partial void  UpdateShippers(Shippers instance)
      

  5.   

    问题是我的理解局部方法只能增加功能,但为什么会减少功能呢?比如chengzq的代码,不定义getNameInfo,那么在test中顶多是不显示part1或者name而已。但是Test中其他的功能还是会继续进行。这体现了功能的增加。但是Linq to sql实现的局部方法是:如果不定义局部方法,则程序访问数据库,按照我的实验,如果定义了局部方法,则程序在调用局部方法的同时不访问数据库——这是功能的减少!我不明白的是用什么机制,实现这种功能的减少。举例来说,我们建立一个函数Test,里面缺省打印一条信息。同时包含一个部分函数的调用。现在定义了一个部分函数,能够让Test中的打印信息消失吗?似乎不能吧。
      

  6.   

    举例来说,我们家里能力一个函数Tesy,里面根本没有打印一条信息的代码,可以通过包含一个部分函数就使它“增加了功能”吗?增加功能减少功能看来都是不靠谱的。我不使用Linq to SQL,所以懒得看它的代码。只能就lz的这个表述发表一点建议。建议重新去怀疑“理解局部方法可以增加功能”这个背后的故事。
      

  7.   

    恩我们用一般的思路来“自己去解决”这类问题,会怎样做?因为没有编译器的帮助,或者不愿意去使用编译器那些不为人知的偏门知识,那么自己怎么去设计这类程序?很简单,只要在类型的static初始化的时候(因为它只是执行一次),反射一下已知名字和参数格式的方法,如果有则使用Delegate.CreateDelegate方法创建一个调用它的委托,赋值给static的委托对象就行了。然后在业务代码中,不过是if(myProc!=null)
         myProc(....);
    else
         .....这样地处理。甚至根本不需要else部分。