在LINQ to SQL中处理数据上下文的最佳方法

本文关键字:上下文 最佳 方法 数据 处理 LINQ to SQL | 更新日期: 2023-09-27 18:03:14

我已经在工作中获得了在我们的ASP中为新模块实现LINQ to SQL的许可。我忘记了处理检索对象所需的DataContext的最佳方法;我应该在使用它的每个方法中创建它,还是使用某种实用程序类以不同的方式管理它?

例如,我有一个以activerecord样式检索实体的类。我应该使用像这样的:

using (MyAppDataContext context = new MyAppDataContext()) 
{
    // do stuff here...
}
在这些方法中的

?我在LINQ教程中经常看到这种情况,但我也看到了一种方法,其中有一个Utilities类,有一些方法返回DataContext (GetContext或类似);我忘记了这个方法是否只是一个新方法的包装,或者它是否做了某种单例类型的机制。

哪个是更好的方法?

在LINQ to SQL中处理数据上下文的最佳方法

就我个人而言,我使用类似这样的东西:

public class MyClass : MyBaseClass
{
     public void GetData()
     {
          using(DbDataContext db = new DbDataContext())
          {
              // DO STUFF
          }
     }
     public void PerformLogicallyAtomicAction()
     {
          using(DbDataContext db = new DbDataContext())
          {
              // DO STUFF
          }
     }
}

除非需要保持数据上下文打开更长的时间。

为了更清楚地说明我这样做的原因:

1)我不希望一个对象在内存中超过我需要的时间

下面是主要原因

2)跟踪变化数据在某些情况下会导致数据陈旧(见OP的第二条评论)

3)创建新对象需要0时间(有效地)

4)通过每次我需要它时创建它,我可以更改特定的LINQ选项(例如。ObjectTrackingEnabled (我经常关闭)

我将使用一个类/对象来包含用于此数据存储库的方法。我用类实例化数据上下文,然后我可以使用它来读取数据,随后更新它并保持在相同的上下文中。

我还使用这个类来集中连接字符串,以便在整个应用程序中访问特定数据时保持一致性:

public class MyInfoRepository
{
    MyInfoDataContext _dc;
    public MyInfoRepository()
    {
        try
        {
            _dc = new MyInfoDataContext(GetDbConnection());
        }
        catch (Exception ex)
        {
            ExceptionLogger.LogServerException(ex, TraceEventType.Error);
            throw;
        }
    }
    private static string GetDbConnection()
    {
        // if no connection string return empty which will stop processing
        if (ConfigurationManager.ConnectionStrings["MyInfo"] == null)
        {
            throw new ConfigurationErrorsException("No connection string specified.");
        }
        string connection = ConfigurationManager.ConnectionStrings["MyInfo"].ConnectionString;
        return connection;
    }
...

正如您的一些评论所述,我不会保持此打开状态,但将其用于特定查询并可能使用using()语句进行更新。