每个DAL保留一个公共DataContext,而不是为每个数据库调用创建它?

时间:2012-03-02 10:57:05

标签: c# linq-to-sql

在我的DAL中,我目前为每个方法使用一个新的DataContext实例,即为每个数据调用创建上下文,然后将其配置(使用using)。我记得我读到这是一种最好的做法。

现在我认为我可能更好地使用每个DAL一个常见的DataContext ,这将需要更少的行来编写,并允许更新数据库中的更改,而无需将实体附加到新创建的上下文。

但我不确定这是否会影响应用程序的生产力。这种新方法是否会出现负面影响,例如“每个上下文保留与数据库的连接线”或“每个应用程序只有有限数量的上下文“?

2 个答案:

答案 0 :(得分:1)

根据我的阅读和我自己的结论,基本规则是:为每个短时间操作集使用单个DataContext实例,这意味着:

  1. 为长生活父对象中的每个操作(事务)使用新的(单独的)DataContext实例,例如DAL。例如,主窗体有一个使用DataContext的DAL,主窗体是桌面应用程序中最长的活动对象,因此具有单个DataContext实例来提供所有主窗体数据操作将不是一个好的解决方案由于缓存增加以及数据过时的风险。

  2. 对短时间生活父对象中的所有操作使用DataContext的单个(公共)实例。例如,如果我们有一个类,它在短时间内执行一组数据操作时间,例如从数据库获取数据,与它们一起操作,更新它们,将更改保存到数据库并被处置,我们最好创建一个DataContext的单个实例并在所有DAL方法中使用它。这与Web应用程序和服务有关,因为它们是无状态的,并且正在按请求执行。

  3. 当我看到需要公共DataContext时的示例:

    DAL:

    // Common DAL DataContext field.
    DataContext Context = new DataContext();
    
    public IEnumerable<Record> GetRecords()
    {
        var records = Context.Records;
    
        foreach (var record in records)
        {
            yield return record;
        }    
    }
    
    public void UpdateData()
    {
        Context.SaveChanges();
    }
    

    BLL:

    public void ManageData()
    {
        foreach (var record in DAL.GetRecords())
        {
             record.IsUpdated = true;
             DAL.UpdateData();
        }
    }
    

答案 1 :(得分:0)

使用这种方法,最终会在内存中创建大量对象(可能是整个数据库)和(这可能更重要),这些对象将不对应于db中的当前值(如果db在您的应用程序/机器之外更新。因此,为了有效地使用内存并为您的实体提供最新的数据值,每个事务创建数据上下文确实更好。