繁体   English   中英

在 LINQ 到 SQL 中处理 DataContext 的最佳方法

[英]Best way to handle the DataContext in LINQ to SQL

我已获准在我们的 ASP.NET 应用程序中为新模块实施 LINQ 到 SQL。 我忘记了处理检索对象所需的 DataContext 的最佳方法; 我应该在每种使用它的方法中创建它,还是有某种实用程序 class 以不同的方式管理它?

例如,我有一个 class,ActiveRecord 样式检索一个实体。 我应该使用类似的东西:

using (MyAppDataContext context = new MyAppDataContext()) 
{
    // do stuff here...
}

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

哪种方法更好?

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

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)我不想要 memory 中的 object 比我需要的时间长

下面是主要原因

2)在某些情况下,跟踪更改数据会导致数据过时(参见 OP 的第二条评论)

3)创建新的object需要0时间(有效)

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

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

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

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 () 语句进行更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM