Почему я получаю сообщение об ошибке «Строка не найдена или изменена»? - PullRequest
0 голосов
/ 21 ноября 2011

Я в течение некоторого времени гуглил ошибку «Строка не найдена или изменена», и я просто не могу понять, как эта ошибка вызывается в моем приложении.

У меня есть класс фасадов, называемый 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; }
}

Unity передает их в соответствии с обычной конфигурацией, регистрируя типы в Global.asax, подключая контроллеры к заводским настройкам, решая с помощью Unity. Кроме того, я зарегистрировал его с помощью PerThreadLifetimeManager (), который я не уверен, правильно ли это.

В большинстве случаев это прекрасно работает, однако проблему можно воспроизвести:

  • Перейти к редактированию действия и опубликовать редактирование (перенаправляет на указатель)
  • Вернитесь к действию «Редактировать» и попытайтесь опубликовать другое изменение, ИЛИ, перейдите к действию «Удалить» и попытайтесь опубликовать удаление для того же элемента

Выдает ошибку «Строка не найдена или изменена». Каждое действие (Редактировать и Удалить) вызывает метод SubmitChanges () для DataContext. Так что я не совсем уверен, что здесь происходит. Если у кого-то есть какие-либо идеи, они будут очень хорошо приняты.

Приветствия

Тим.

1 Ответ

0 голосов
/ 22 ноября 2011

Я подозреваю, что время жизни для каждого потока здесь не подходит - ASP.NET повторно использует потоки для разных запросов, и это может привести к повторному использованию ваших старых контекстов для нескольких запросов, возможно, оставляя их в нечетных состояниях.

Выесть два варианта:

  1. Если вы вызываете только container.resolve на контроллере, вы можете вместо этого использовать встроенный PerResolveLifetimeManager.Это даст вам один объект DataAccess для каждого разрешения контроллера.
  2. Вы можете получить одну из множества реализаций PerRequestLifetimeManager и получить новый объект DataAccess для HttpRequest.

В любом случае, яПодозреваю, вытащить вас из проблем, которые у вас есть в настоящее время.

...