2、“先根据传入product对象的id,查询出原始的product,然后利用反射自动copy新属性”
DataContext专门提供了Refresh()函数,可以读取entity的数据库值,再通过指定的RefreshMode来刷新 entity的当前值或原始值。在更新entity前,我们首先需要Attach对象,因为通过 DataContext.Refresh(RefreshMode.KeepCurrentValues, entity)可获得entity的原始值,把判断entity是否已更改的工作交给DataContext,所以我们只需要调用 Attach(entity)或Attach(entity, false),而不需要调用Attach(entity, true)或Attach(entity, originalEntity),更不需要”copy”了。
3、“楼主的NorthwindDataContext实例化太厉害了,要知道datacontext是个很大的对象,应该避免不停地实例化。最好是一次request只有一个实例,你的问题就迎刃而解了。”
在LINQ2SQL的Design Intent有说过,LINQ2SQL的应用模式是“Unit of work”,即创建-调用-销毁,目的就是为了在调用完毕后快速释放DataContext由于保存对象副本和SQL连接所占用的资源,DataContext提供了足够的机制来保证实例化的消耗在可以接受的范围。但如果在一次http request里keep住DataContext对象,不小心反而会造成内存不必要的占用