2011-11-21 77 views
0

我已经搜索了一段时间的“行未找到或更改”错误,我只是无法看到错误是如何在我的应用程序中造成的。为什么我在这里得到“行未找到或更改”错误?

我有一个叫做DataAccess的外观类,它封装了多个存储库,并在我的应用程序中传递。每一个控制器都依赖于DataAccess,所以我把它连接起来以便按需要传递出去。

数据访问看起来大致是这样的,在截断/抽象形式:

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; } 
} 

团结手这些出根据显示的内容为正常配置,在Global.asax中注册类型,将控制器连接到工厂,统一解析。此外,我用PerThreadLifetimeManager()注册它,我不确定是否正确。 -

对于这个伟大工程的大部分不过问题可以通过转载:

  • 去编辑动作,然后再发布编辑(重定向到索引)
  • 返回到编辑行动和企图要发布另一个编辑,或者进入删除操作并尝试在同一项目上发布删除

这会引发“未找到或未找到行”错误。每个操作(编辑和删除)都会在DataContext上调用SubmitChanges()。所以我不太确定这里发生了什么。如果任何人有任何想法,他们会非常好的接受。

干杯,

Tim。

回答

0

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

你有两个选择:

  1. 如果您只调用控制器上container.resolve,那么你可以使用内置的PerResolveLifetimeManager代替。这会为每个控制器解析提供一个DataAccess对象。
  2. 您可以抓取许多PerRequestLifetimeManager实现中的一个,并根据HttpRequest获取新的DataAccess对象。

无论哪种方式,我怀疑,让你摆脱你目前遇到的问题。

+0

非常感谢,这已经解决了我目前遇到的问题。有一个玩弄,我现在有一些新的问题与实施(1),偶尔“试图附加或添加一个不是新的实体,可能是从另一个DataContext加载”错误..有关于此的任何想法? – Hanshan

+0

好吧,通常这意味着你正试图附加一个已经从另一个上下文中使用过的实体。那实际上是怎么回事?我不是EF专家(或用户),所以我真的不能说。 –

+0

谢谢,伙计 - 我必须仔细观察这一张 - 你在这里给了我很大的帮助。干杯。 – Hanshan

相关问题