【问题标题】:MSDTC on server 'servername' is unavailable with linq to sql服务器 'servername' 上的 MSDTC 对 linq to sql 不可用
【发布时间】:2015-06-30 18:17:00
【问题描述】:

我正在使用带有 linqtosql 的 Transactionscope。我有以下代码:

public bool Save(int Id, List<Student> students, List<Subject> subjects)
 {
            var isDataSaved = false;
             using (TransactionScope scope = new TransactionScope())
             {
                try
                {
                    // Save the students
                    SaveStudents(students);

                    // Save the subjects
                    SaveSubjects(subjects);

                    scope.Complete();

                    isDataSaved = true;
                }
                catch (Exception ex)
                {
                    throw ex;
                }

                return isDataSaved;
             }
 }

在这两种方法中,我都使用了两个表:学生,科目存在于同一数据库中。使用下面类中提到的构造函数设置 datacontext 对象依赖项:

public class StudentsRepository:IStudentsRepository
{
   public StudentsRepository()
   {
     _dataContext = new SchoollDetailsDataContext(connectionString);
   }   
}

SaveStudents 和 SaveSubjects 方法都使用相同的 datacontext 对象。

我遇到了一个异常:服务器 'servername' 上的 MSDTC 不可用。

根据我的初步分析,当数据库操作在我的本地数据库中而另一个将在远程数据库中时,会发生这种错误。

谁能帮我知道我在这里遗漏了什么?

【问题讨论】:

  • “使用相同的数据上下文对象”我对此表示怀疑。这里打开了两个连接。这与本地/远程无关。发布完整的异常 ToString。您遗漏了信息。
  • isDataSaved 应该做什么?此方法将始终返回 true。删除变量和捕获。
  • 第一次在方法中使用相同的_dataContext:SaveStudents,然后转移到SaveSubjects。 isDataSaved 变量值用于跟踪正在保存的数据。
  • 发布异常 ToString 输出。

标签: linq-to-sql asp.net-web-api2 transactionscope


【解决方案1】:

您需要开启 MSDTC 服务。

开始-->控制面板-->管理工具-->服务。 找到服务分布式事务协调器并启动它。 默认情况下,它的启动属性设置为手动,因此它已关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多