在上一篇随笔中,我们列举了使用LINQ to SQL对数据库进行更新的5中方案。本文将对这几种方案进 行测试和对比,力求找出一个最佳实践。
准备工作
我们的测试还是基于Products表。为了使测试更符合实际,我们将与之关联的Categories、Suplliers 和Order_Details表都添加进来。首先创建一个IProductRepository接口,定义插入、查找、更新操作:
public interface IProductRepository
{
void InsertProduct(Product product);
Product GetProduct(int id);
void UpdateProduct(Product product);
}
然后创建一个AbstractProductRepository抽象类,实现IProductRepository接口。由于插入操作都是 一样的,我们在抽象基类中提供了默认实现。同时还提供可选的查询操作,因为除了“禁用查询跟踪”方 案外,其余的查询操作也是一样的。
public abstract class AbstractProductRepository : IProductRepository
{
public void InsertProduct(Product product)
{
NorthwindDataContext db = new NorthwindDataContext();
db.Products.InsertOnSubmit(product);
db.SubmitChanges();
}
public virtual Product GetProduct(int id)
{
NorthwindDataContext db = new NorthwindDataContext();
return db.Products.SingleOrDefault(p => p.ProductID == id);
}
public abstract void UpdateProduct(Product product);
}
接下来创建各个方案的实现类(具体的代码请参考文章最后的下载链接):
方案一 重新赋值:CopyPropertiesProductRepository
方案二 禁用对象跟踪:EnableObjectTrackingProductRepository
方案三 移除关联:DetachAssociationProductRepository
方案四 使用委托:UsingDelegateProductRepository