为什么显示“未找到行或已更改”?这里的错误
本文关键字:这里 错误 显示 为什么 | 更新日期: 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跨请求重用线程,这将导致跨多个请求重用旧上下文,可能使它们处于奇怪的状态。
你有两个选择:
- 如果只调用container。那么你就可以使用内置的PerResolveLifetimeManager来代替。这将为每个控制器解析提供单个DataAccess对象。
- 你可以抓住一个PerRequestLifetimeManager实现和获得一个新的数据访问对象每HttpRequest。