MARS в SQL Server 2000 - PullRequest
       2

MARS в SQL Server 2000

0 голосов
/ 01 октября 2010

Я работаю в ASP.Net MVC 1.0 и SQL Server 2000, используя Entity Framework.Мой неисправный код контроллера приведен ниже:

            int checkUser = id ?? 0;
            string userNameFromNew, userNameToNew;

            if (checkUser == 1)
            {
                userNameFromNew = "U" + Request.Form["usernameFrom"];
                userNameToNew = "U" + Request.Form["usernameTo"];
            }
            else
            {
                userNameFromNew = "C" + Request.Form["usernameFrom"];
                userNameToNew = "C" + Request.Form["usernameTo"];
            }

            var rMatrix = from Datas in repository.GetTotalRightData() 
                          where Datas.UserName == userNameFromNew.Trim()
                          select Datas;

            Right_Matrix RM = new Right_Matrix();


            foreach(var Data in rMatrix)
            {
                RM.Column_Id = Data.Column_Id;
                RM.ProMonSys_Right = Data.ProMonSys_Right;
                RM.UserName = userNameToNew;
                UpdateModel(RM);
                this.repository.AddRightTransfer(RM);
            }

            return RedirectToAction("RightTransfer");

Мой неисправный код модели приведен ниже:

            public void AddRightTransfer(Right_Matrix RM)
            {
                context.AddObject("Right_Matrix", RM);
                context.SaveChanges();
            }

Мой код показывает ошибку, если она присутствует в коде модели, заявляя, что DataReader ужеоткрыть, и мне нужно сначала закрыть его.

Пожалуйста, предложите обходной путь.

Ответы [ 2 ]

1 голос
/ 01 октября 2010

Попробуйте переместить цикл AddRightTransfer из foreach LINQ в отдельный цикл.Я думаю, что LINQ выполняет первое добавление, прежде чем набор результатов базы данных будет закрыт.Переместив вызов AddRightTransfer во второй foreach, вы должны избежать проблемы, если это происходит.

Вот пример:

List<Right_Matrix> matrixes = new List<Right_Matrix>();

foreach (var Data in rMatrix)
{
    Right_Matrix rm = new Right_Matrix();
    rm.Column_Id = Data.Column_Id;
    rm.ProMonSys_Right = Data.ProMonSys_Right;
    rm.UserName = userNameToNew;
    UpdateModel(rm);
    matrixes.Add(rm);
}

foreach (var rm in matrixes)
{
    this.repository.AddRightTransfer(rm);
}
0 голосов
/ 01 октября 2010

Проблема в том, что вы модифицируете базу данных, продолжая итерировать по ней. Либо завершите запрос перед изменением, например:

foreach(var Data in rMatrix.ToArray())

Или не изменяйте базу данных в вашем цикле, например:

        foreach(var Data in rMatrix)   
        {   
            RM.Column_Id = Data.Column_Id;   
            RM.ProMonSys_Right = Data.ProMonSys_Right;   
            RM.UserName = userNameToNew;   
            UpdateModel(RM);   
            context.AddObject("Right_Matrix", RM);  
        }
        context.SaveChanges();

Очевидно, что эти два context. вызова должны быть включены в методы в вашем хранилище, но вы получите картину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...