【问题标题】:Best way to handle the DataContext in LINQ to SQL在 LINQ to SQL 中处理 DataContext 的最佳方法
【发布时间】:2011-07-22 13:33:19
【问题描述】:

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

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

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

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

哪种方法更好?

【问题讨论】:

  • 你的应用是什么?网络? wpf?这可能很重要......(但在任何一种情况下,单身可能都是一个非常糟糕的主意 - 不要那样做)
  • 您不想打开 DataContext。见神话#10 albahari.com/nutshell/10linqmyths.aspx
  • @asawyer 是的,但是在“每个查询”和“全局”之间有一个中间地带;例如,在 Web 应用程序中,您可能会选择“按请求”,这将有合理的机会从身份管理器等中“命中”,而不会出现过时数据或线程安全问题

标签: c# linq-to-sql


【解决方案1】:

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

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 (我经常关闭它)

【讨论】:

  • 用“PerformLogicallyAtomicAction”交换“GetData”,我同意。 =)
【解决方案2】:

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

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

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;
    }

...

正如你们的一些 cmets 所说,我不会保持打开状态,而是将其用于特定查询并可能使用 using () 语句进行更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2015-11-03
    • 2011-01-22
    • 2010-10-23
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多