Linq to sql 在基于LINQ到SQL的存储库中,我们是否应该在每个方法中创建新的DataContext?

Linq to sql 在基于LINQ到SQL的存储库中,我们是否应该在每个方法中创建新的DataContext?,linq-to-sql,repository,repository-pattern,Linq To Sql,Repository,Repository Pattern,例如: class repository { private DataContext db = new DataContext(); public IQueryable<Blah> someMethod(int id){ return from b in db.Blah ... select b; } public IQueryable<Blah> someMethod2(int id){ retur

例如:

class repository {

     private DataContext db = new DataContext();

     public IQueryable<Blah> someMethod(int id){
         return from b in db.Blah ... select b;
}

     public IQueryable<Blah> someMethod2(int id){
         return from b in db.Blah ... select b;
}

     public IQueryable<Blah> someMethod3(int id){
         return from b in db.Blah ... select b;
}

}
类存储库{
私有DataContext db=新DataContext();
公共IQueryable someMethod(int id){
从db.Blah中的b返回…选择b;
}
公共IQueryable someMethod2(内部id){
从db.Blah中的b返回…选择b;
}
公共IQueryable someMethod3(内部id){
从db.Blah中的b返回…选择b;
}
}

我们应该在每个方法中创建一个新的DataContext吗

我认为,由于每个存储库实例只有一个DataContext,一旦用户负载增加,我们就会出现一些错误,这是一个准确的假设吗?

我知道这不完全相同,但是,在使用老式数据适配器的大量使用的asp.net站点中,我曾经在page init上打开与数据库的连接,并在page prerender上关闭它。然而,我发现,当网站负载增加时,页面开始爬行。我在某个地方读到,最好是尽可能晚开盘,尽可能早关门

现在我在每个方法中打开上下文,但是由于linq 2 sql及其延迟执行,我不确定这是否会造成很大的差异

我会在忙碌的时候运行SQL分析器,看看瓶颈在哪里…

另请参阅问题的答案

简言之,特别是在使用存储库模式的情况下,您应该为每个工作单元创建和处理datacontext。通常我会使用以下内容:

public someclass someMethod(int id)
{
    using (var db = new SomeDataContext())
    {
        return db.FindMyClass(id);
    }
}

我个人所做的是将存储库变成一次性的。然后得到如下构造:

void DeleteCustomer(int id)
{
    using(var repos = GetRepos())
    {
        var customer = repos.GetAll<Customer>().Single(x => x.Id == id);
        repos.Delete(customer);
        repos.SaveChanges();
    }
}
在这种情况下,最好尽可能将存储库移到外部:

IQueryable<Customer> GetCustomers(MyRepository repos)
{
    return repos.GetAll<Customer>();
}

void Test()
{
    using(var repos = ...)
    {
        var customers = GetCustomers(repos).Where(x => x.Id == 123); 
    }
}
IQueryable GetCustomers(MyRepository repos)
{
return repos.GetAll();
}
无效测试()
{
使用(var repos=…)
{
var客户=GetCustomers(回购),其中(x=>x.Id==123);
}
}

在实体框架的上下文中提出了一个类似的问题,但仍然值得一看,因为DataContext和ObjectContext的工作非常相似:这与打开和关闭连接有关。Linq到sql和实体框架在完成查询后立即关闭连接。结合连接池,这是一个非常快速和可扩展的解决方案。请注意,连接的寿命远远短于上下文本身,因此数据上下文遵循延迟打开连接和提前关闭连接的模式?关于sql概要文件,我的最后一点仍然有效。什么是SomeDataContext()?这是否意味着您创建的类继承自DataContext?因此,您可以在其中而不是在存储库中创建获取所需数据的方法?不,这是实际的datacontext,不是派生类。对不起,如果这个假名字让人困惑。这对你有什么好处?根据我的经验,如果您不能保证您可能想在上下文中做更多的工作,那么使用“使用”会引发意外的运行时错误。我认为这是相当安全的,因为它会在连接完成后立即关闭连接(因此不会保持连接打开),并且当上下文+查询超出范围时,GC会将其清除。
IQueryable<Customer> GetCustomers(MyRepository repos)
{
    return repos.GetAll<Customer>();
}

void Test()
{
    using(var repos = ...)
    {
        var customers = GetCustomers(repos).Where(x => x.Id == 123); 
    }
}