我已经开始为我们的ASP.NET应用程序中的新模块实现LINQ to SQL。我忘记了处理检索对象所需的DataContext的最佳方法;我应该在每个使用它的方法中创建它,还是使用某种Utility类以不同的方式管理它?
例如,我有一个ActiveRecord样式检索实体的类。我应该使用类似的东西吗?
using (MyAppDataContext context = new MyAppDataContext())
{
// do stuff here...
}
在每种方法中?我在LINQ教程中经常看到这种情况,但我也看到过有一个Utilities
类的方法,它有一些方法可以返回DataContext(GetContext
或类似的);我忘了如果这个方法只是一个新的一个包装器,或者它是否采用某种类型的Singleton类型机制。
哪种方法更好?
答案 0 :(得分: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的第2条评论)
3)创建新对象需要0次(有效)
4)通过每次需要时创建它,我可以更改特定的LINQ选项(EG.ObjectTrackingEnabled (我经常关闭)
答案 1 :(得分:0)
我会使用类/对象来包含您为此数据存储库使用的方法。我使用类实例化datacontext然后我可以使用它来读取数据并随后更新它并保持在相同的上下文中。
我还使用此类来集中连接字符串,以便在访问此特定数据时整个应用程序具有一致性:
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()语句进行更新。