为什么显示“未找到行或已更改”?这里的错误

本文关键字:这里 错误 显示 为什么 | 更新日期: 2023-09-27 18:15:13

我已经围绕"行未找到或更改"错误搜索了一段时间,我只是无法看到错误是如何在我的应用程序中引起的。

我有一个名为DataAccess的facade类,它包装了多个存储库,并在我的应用程序中传递。每个控制器都依赖于DataAccess,所以我将其连接到unity以根据需要传递。

数据访问大致如下所示,截断/抽象形式:

public class DataAccess : IDataAccess
{
    private MyDataContext DataContext = new MyDataContext();
    public Repository1 Repo1 = new Repository1();
    public Repository2 Repo2 = new Repository2();
    public DataAccess()
    {
        Repo1.DataContext = DataContext;
        Repo2.DataContext = DataContext;
    }
}

那么每个控制器都有一个IDataAccess依赖,如下所示:

public class MyControllerBase
{
    [Dependency]
    IDataAccess DataAccess { get; set; }
}

Unity根据正常配置分发这些,在Global中注册类型。Asax,将控制器连接到工厂,统一解决。此外,我已将其注册为PerThreadLifetimeManager(),我不确定是否正确。

在大多数情况下,这很有效-但是问题可以通过以下方式重现:

  • 进入编辑操作并发布编辑(重定向到索引)
  • 返回编辑操作并尝试发布另一个编辑,或者,进入删除操作并尝试在同一项目上发布删除

这会抛出"未找到或更改的行"错误。每个操作(编辑和删除)都调用DataContext上的SubmitChanges()。所以我不太确定这是怎么回事。如果任何人有任何想法,我们都会非常欢迎。

欢呼,蒂姆。

为什么显示“未找到行或已更改”?这里的错误

我怀疑每个线程的生命周期在这里是不合适的。. NET跨请求重用线程,这将导致跨多个请求重用旧上下文,可能使它们处于奇怪的状态。

你有两个选择:

  1. 如果只调用container。那么你就可以使用内置的PerResolveLifetimeManager来代替。这将为每个控制器解析提供单个DataAccess对象。
  2. 你可以抓住一个PerRequestLifetimeManager实现和获得一个新的数据访问对象每HttpRequest。