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的强憾
