c# - LINQ 到 SQL : Reusing DataContext

标签 c# sql linq-to-sql

我有许多静态方法可以执行插入或删除记录等简单操作。所有这些方法都遵循这个 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/

相关文章:

c# - 使用 WebClient 将图像数据发送到服务器的最佳方式

c# - 如何设置 RequiredFieldValidator 以针对具有多个实例的特定用户控件进行验证?

c# - 基于 session 的接收器的 Azure ServiceBus 管理

c# - Entity Framework - 合并两行数据

PHP 图表 - 用值填充缺失的日期

python - 在单个 Django 模型字段中存储两种类型的值

mysql - 在mysql查询中获取历史表的净总数

c# - LINQ外连接动态OrderBy

c# - 如果数据库字段包含数据,则返回 bool 值

ASP.net:如何测试 LINQ 查询