最佳方式处理 LINQ to SQL中的 DataContext

3
我在工作中获得了使用LINQ to SQL实现我们ASP.NET应用程序的新模块的批准。我忘记了处理检索对象所需的DataContext的最佳方法;我应该在每个使用它的方法中创建它,还是有某种类型的实用程序类以不同方式管理它?
例如,我有一个类,ActiveRecord-style检索实体。我应该使用像这样的东西:
using (MyAppDataContext context = new MyAppDataContext()) 
{
    // do stuff here...
}

在这些方法中,哪种方法更好?我在LINQ教程中经常看到这种方法,但我也见过一种方法,其中有一个Utilities类,该类具有返回DataContext的某些方法(GetContext或类似方法); 我忘记了该方法是否只是包装新建一个实例还是执行了某种Singleton类型的机制。

哪种方法更好?


2
你的应用是什么?Web?WPF?这可能很重要...但无论哪种情况,单例模式都可能是一个非常糟糕的想法 - 不要这样做。 - Marc Gravell
你不想保持DataContext处于打开状态。请参阅Myth#10 http://www.albahari.com/nutshell/10linqmyths.aspx - asawyer
5
@asawyer 是的,但是在“每个查询”和“全局”之间存在一个折中方案;例如,在Web应用程序中,您可以选择“每个请求”,这将在不引起过期数据或线程安全问题的情况下合理地从身份管理器等处获取“命中”。 - Marc Gravell
2个回答

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”,我同意。=) - J. Steen

0
我会使用一个类/对象来包含您用于此数据存储库的方法。我使用该类实例化数据上下文,然后可以使用它来读取数据,随后更新数据并保持在同一上下文中。
我还使用此类来集中连接字符串,以便在访问特定数据时整个应用程序具有一致性:
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() 语句进行更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接