在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
或类似);我忘记了这个方法是否只是一个新方法的包装,或者它是否做了某种单例类型的机制。
哪个是更好的方法?
就我个人而言,我使用类似这样的东西:
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()语句进行更新。