【问题标题】:Keep one common DataContext per DAL instead of create it for each database call?为每个 DAL 保留一个通用 DataContext,而不是为每个数据库调用创建它?
【发布时间】:2012-03-02 10:57:04
【问题描述】:

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

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

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

【问题讨论】:

  • here 上有很多被引用的讨论。正确答案很大程度上取决于您所讨论的应用程序类型(网络、服务、智能客户端)。

标签: c# linq-to-sql


【解决方案1】:

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

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

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

当我看到一个通用 DataContext 的要求时的示例:

达尔:

// 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();
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多