linq to sql为我们提供了集成运行时的ORM支持,非常方便实现CURD操作,并且提供了很好的扩展框架,验证规则的插入就是一个很好的例子。
下面以往northwind数据库的product表插入一条记录为例来介绍linq to sql的验证逻辑吧
通常我们是这样插入一条product记录的
            NorthwindDataConextDataContext db = new NorthwindDataConextDataContext();
        
            Product p1 = new Product();
            p1.ProductName = "ghb11111";
            p1.CategoryID = 1;
            p1.UnitPrice = 1;
            p1.UnitsInStock = 1;
            db.Products.InsertOnSubmit(p1);
            db.SubmitChanges();

假如我们有如下新增需要,只允许所有产品名称开头为1的产品才可以添加到数据库当中,这个规则是我们自己的,自然linq to sql的代码是没有这么做,那么我们怎么才能在改动最少的情况下增加这样的验证规则呢,你可能说在上面倒数第2行代码之前插入一个产品名称是包含开头字母为1的判断就行,如果不包含则不执行倒数两行代码,否则就执行,如果这样那假如我们有100个地方有插入产品的代码,那这100处都要改了,其实linq to sql已经为我们想到了,有两种方式可以让我们很容易实现。
一、添加NorthwindDataConextDataContext局部类
partial class NorthwindDataConextDataContext
    {
        partial void InsertProduct(Product instance)
        {
            //to do valid rule
            if (!instance.ProductName.StartsWith("1"))
            {
                throw new Exception("开头未包含1");
            }
            this.ExecuteDynamicInsert(instance);
        }
    }
这样当执行db.SubmitChanges();InsertProduct方法自动被调用,不过你要记得红色行的那一句不能少。
二、添加product局部类
partial class product
{
      //添加局部方法
       partial void OnValidate(System.Data.Linq.ChangeAction action)
        {
            if (!ProductName.StartsWith("1"))
            {
                throw new Exception("开头未包含1");
            }
        }

}
这样当执行db.SubmitChanges();OnValidate方法自动被调用

局部方法在vs2008中提供了完全的智能感应,你不用担心到底是onValidate还是OnValidate,就像以前的override一样通过智能感应选择就行了,呵。不得不佩服ms的强憾

posted on 2008-01-10 18:31  shore  阅读(721)  评论(0编辑  收藏  举报