Welcome

首页 / 软件开发 / LINQ / 使用LINQ to SQL更新数据库(中):几种解决方案

使用LINQ to SQL更新数据库(中):几种解决方案2011-08-04 博客园 麒麟.NET在前一篇文章中,我提出了在使用LINQ to SQL进行更新操作时可能会遇到的几种问题。其实这并不是 我一个人遇到的问题,当我在互联网上寻找答案时,我发现很多人都对这个话题发表过类似文章。但另我 无法满足的是,他们尽管提出了问题,却没有进行详细的剖析,只给出了解决方案(如添加RowVersion列 、去除关联等),但却没有说明为什么必须这么做。这也是我写上篇的初衷,希望通过对LINQ to SQL源 代码的分析,来一步一步找出解决问题的办法。本文将对这些方法一一进行讨论。

方案一:重新赋值

在TerryLee、Anytao和Ding Xue等人的开源框架Ezsocio中,有些地方采取了重新赋值的方法。在 Update方法内部,根据主键获取数据库中的实体,然后与参数中的实体对其属性一一赋值。

public void UpdateProfile(Profile p)
{
using (RepositoryContext db = new RepositoryContext())
{
var profile = db.GetTable<Profile>().First<Profile>(u => u.ID == p.ID);
profile.Birthday = p.Birthday;
profile.Gender = p.Gender;
profile.Hometown = p.Hometown;
profile.MSN = p.MSN;
profile.NickName = p.NickName;
profile.PhoneNumber = p.PhoneNumber;
profile.QQ = p.QQ;
profile.State = p.State;
profile.TrueName = p.TrueName;
profile.StateRefreshTime = p.StateRefreshTime;
profile.Avatar = p.Avatar;
profile.Website = p.Website;
db.SubmitChanges();
}
}

杨过兄也同样给出了该方案的反射方法,实现属性值的自动拷贝。

但我个人认为这是一种避实就虚的方案,没有使用LINQ to SQL提供的用于更新操作的API,而采取了 一种迂回的策略。这其实是一种妥协,难道因为Attach方法“不好用”,我们就不用了吗?呵呵。

方案二:禁用对象跟踪

对此,lea提出可以通过将DataContext的ObjectTrackingEnabled属性设置为false,来达到正确更新 的目的。

public Product GetProduct(int id)
{
NorthwindDataContext db = new NorthwindDataContext();

db.ObjectTrackingEnabled =
false
;

return db.Products.SingleOrDefault(p => p.ProductID == id);
}