我有许多静态方法可以执行插入或删除记录等简单操作。所有这些方法都遵循这个 using
模板:
public static UserDataModel FromEmail(string email)
{
using (var db = new MyWebAppDataContext())
{
db.ObjectTrackingEnabled = false;
return (from u in db.UserDataModels
where u.Email == email
select u).Single();
}
}
我还有一些方法需要执行多个使用 DataContext
的操作:
public static UserPreferencesDataModel Preferences(string email)
{
return UserDataModel.Preferences(UserDataModel.FromEmail(email));
}
private static UserPreferencesViewModel Preferences(UserDataModel user)
{
using(var db = new MyWebAppDataContext())
{
var preferences = (from u in db.UserDataModels
where u == user
select u.Preferences).Single();
return new UserPreferencesViewModel(preferences);
}
}
我喜欢这样,我可以使用 FromEmail()
等静态方法在我的数据模型中将简单操作划分为伪存储过程,但我担心拥有 Preferences( )
通过两个 using DataContext
语句调用两个连接(对吗?)。
我需要成为吗?我正在做的事情是否比使用单个 using(var db = new MyWebAppDataContext())
语句效率低?
最佳答案
如果您检查这“两个”操作,您可能会发现它们可以在 1 个数据库往返中执行。 最小化数据库往返是一个主要的性能目标(仅次于最小化数据库 io)。
如果您有多个数据上下文,它们会以不同的方式查看同一条记录。通常,ObjectTracking 要求始终使用同一个实例来表示单个记录。如果您有 2 个 DataContext,它们每个都在自己的实例上执行自己的对象跟踪。
假设记录在 DC1 观察它和 DC2 观察它之间发生变化。在这种情况下,记录不仅会有 2 个不同的实例,而且这些不同的实例会有不同的值。针对此类移动目标表达业务逻辑可能非常具有挑战性。
您应该明确地在 UnitOfWork 之后停用 DataContext,以保护您自己免受陈旧记录实例的影响。
关于c# - LINQ 到 SQL : Reusing DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441355/