ASP.NET LINQ SQL DATABASE

3
我正在制作一个.NET系统。我正在使用LINQ和MVC。我必须创建实时数据库,并希望这一切都能顺利进行,但事实并非如此。
新的SQL SERVER - Microsoft Windows NT 5.0 (2195) / 8.00.760
我创建了一个管理员用户,可以添加/编辑/删除。如果我尝试添加(.InsertOnSubmit)或删除(.DeleteOnSubmit)任何行,基本上会收到以下错误,但是在编辑时不会出现该错误。
"Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool."

我已经在谷歌上搜索过这个错误,并发现人们认为它与“MSDTC服务”有关,但是该服务似乎已经被勾选。我已经通过SQL Server Management登录数据库,这个用户可以添加/删除。
一个例子:
Controller
if (_service.AddAccess(access)) return RedirectToAction("Access");

public Repository()
{
    _db = new DataClassDataContext(ConfigurationManager.ConnectionStrings["RegistrarsServices"].ConnectionString);
}

public void Save()
{
    _db.SubmitChanges();
}

public bool AddAccess(Access access)
{
    try
    {
        using (var scope = new TransactionScope())
        {
            _db.Accesses.InsertOnSubmit(access);
            Save();

            scope.Complete();
        }
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

请注意,当使用开发服务器时,这是有效的。Microsoft Windows NT 5.2 (3790) / 10.0.1600.22

控制器

private readonly ServiceAdministration _service = new ServiceAdministration();

public ActionResult AddAccess()
{
    return View(new EmailViewModel());
}

[HttpPost]
public ActionResult AddAccess(EmailViewModel emailViewModel)
{
    if (emailViewModel.Button == "Back") return RedirectToAction("Access");

    if (!ModelState.IsValid) return View(emailViewModel);

    Access access = new Access();
    access.emailAddress = emailViewModel.emailAddress;

    if (_service.AddAccess(access)) return RedirectToAction("Access");

    emailViewModel.errorMessage = "An error has occurred whilst trying to grant access. Please try again later.";
    return View(emailViewModel);
}

服务

readonly Repository _repository = new Repository();

public bool AddAccess(Access access)
{
    return _repository.AddAccess(access);
}

我不是很清楚我缺少什么。

提前感谢您的任何帮助。

克莱尔 :-)

1个回答

5

您是否知道为什么会触发分布式事务呢?这是需要调查的问题。通常罪魁祸首是在单个TransactionScope中使用了多个ADO.Net连接。详见ADO.NET和System.Transactions以及ADO.NET和LINQ to SQL。确保在事务范围内只使用一个连接(即LINQ2SQL上下文)。无论如何,在每个HTTP调用中,您都不应该使用超过一个连接。


不,我没有。控制器在添加之前不会触发其他查询。而且我不确定为什么只有在添加/删除时才会发生,如果涉及分布式事务,那么在编辑时也不会发生吗?如果我听起来很蠢,请原谅,因为我现在才开始学习这个。此外,在开发服务器上它是可以工作的。 - ClareBear
你确定调用 Repository 的代码中没有其他外部 TransactionScope 吗?内部范围将简单地添加到外部范围中,而不会真正提交。 - Remus Rusanu
我对“AddAccess”函数非常确定。请查看更新的问题,其中包括代码。 - ClareBear
在连接字符串中添加Enlist=false。如果它尝试在DTC中注册,它将在触发注册的位置引发C#异常。 - Remus Rusanu
1
SQL Profiler 和监视器用于 DTCTransaction 事件类 - Remus Rusanu
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接