我之所以问这个问题,是因为我最近看到另一个开发人员在我正在处理的某些代码中发表的评论,提到需要在添加一些对象后重新创建上下文,然后再执行一些其他操作。
也就是说,我应该这样做:
public class ServiceHelper
{
public void DoSomething()
{
DataContext ctx = new DataContext(Uri);
//do something with the context and call SaveChanges()
}
public int GetSometing()
{
DataContext ctx = new DataContext(Uri);
return ctx.GetSomething();
}
}
或者是这样:
public class ServiceHelper
{
private readonly DataContext _ctx = new DataContext(Uri);
public void DoSomething()
{
//do something with _ctx and call SaveChanges()
}
public int GetSomething()
{
return _ctx.GetSomething();
}
}
我还应该补充一点,这是在ASP.NET MVC应用程序的上下文中,所以这里的ServiceHelper类将在每个页面请求时重新构建。
编辑
好吧,据微软公司称,两种方法都是有效的,因为它们是短暂的类,但我仍然想知道它们是否同样“安全”和等效。也就是说,如果我添加/更新了一些实体并调用SaveChanges,那么可能有一个单独的应用程序对相同实体进行了更新,然后我再次使用相同的上下文实例检索这些实体,那么是否会像我在第二个操作之前创建新的上下文时那样表现一样?
结论
我刚发现这个,我认为它有助于解释区别:
默认情况下,客户端仅将响应源中的条目实体化为对象,以便那些尚未由DataServiceContext跟踪的实体。 这意味着不会覆盖已经在高速缓存中的对象。此行为由为查询和加载操作指定MergeOption值来控制。 此选项是通过在DataServiceContext上设置MergeOption属性来指定的。 默认合并选项值为AppendOnly。这仅实例化尚未被跟踪的实体对象,这意味着现有对象不会被覆盖。 防止从数据服务更新对客户端上的对象进行更改的另一种方法是指定PreserveChanges。 当您指定OverwriteChanges时,客户端上对象的值将由响应源中的条目的最新值替换,即使已对这些对象进行了更改也是如此。
因此,如果我更新了一些实体,然后有一个单独的应用程序进行了进一步的更改,然后我再次使用相同的DataServiceContext实例检索这些实体,那么取决于MergeOption设置是什么,我将获取实体以数据库中的状态还是以本地最后一次拥有它们的状态。