Привет, у меня проблемы с устранением этой ошибки. Любая помощь по проблеме будет высоко оценена, спасибо!
Сообщение об ошибке:
Оператор обновления, вставки или удаления хранилища затронул непредвиденное количество строк (0). Объекты могли быть изменены или удалены после загрузки объектов. Обновите записи ObjectStateManager.
Всякий раз, когда я пытаюсь добавить ноутбук/рабочий стол, я получаю указанное выше сообщение об ошибке.
Все работает нормально при локальном запуске, но не на dev. Веб-сайт и служба/база данных находятся на двух разных устройствах разработки.
Tables:
Computer: ComputerID, UserID, HardwareName, Brand, IsDefaultDevice
Desktop: ComputerID, MonitorWidth
Laptop: ComputerID, BatteryLife
generated sql:
exec sp_executesql N'insert [ScratchPad].[Computer]([UserID], [ComputerName], [Brand], [IsDefaultDevice])
values (@0, @1, @2, @3)
select [ComputerID]
from [ScratchPad].[Computer]
where @@ROWCOUNT > 0 and [ComputerID] = scope_identity()',N'@0 bigint,@1 nvarchar(19),@2 int,@3 bit',@0=2,@1=N'Computer666',@2=1,@3=0
using(var context = new MyDatabaseEntities())
{
User user = context.Users.FirstOrDefault(x => x.UserID == userId);
entityToAdd.User = user;
bool hasOthers = context.Computers.Any(x=>x.User.UserID == userId);
if(!hasOthers && !entityToAdd.IsDefaultDevice)
entityToAdd.IsDefaultDevice = true;
entityToAdd.BrandReference.EntityKey = Brand.GetDellProviderKey();
context.AddToComputers(entityToAdd);
context.SaveChanges();
}
Вот трассировка стека:
Во время выполнения текущего веб-запроса возникло необработанное исключение. Информацию о происхождении и расположении исключения можно определить с помощью приведенной ниже трассировки стека исключений.
Трассировки стека:
[FaultException`1: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.]
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +10259418
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +539
myWebPortal.Repositories.UserServiceRef.IUserService.AddComputer(Int64 userId, Computer toAdd) +0
myWebPortal.Repositories.UserServiceRef.UseServiceClient.AddComputer(Int64 userId, Computer toAdd) in c:\users\katelyn\documents\my web project\myWebPortal.repositories\service references\userserviceref\reference.cs:1282
myWebPortal.Repositories.UserAccountRepository.AddComputer(Int64 userId, Computer computer) in C:\Users\katelyn\Documents\my Web Project\myWebPortal.Repositories\UserRepository.cs:238
myWebPortal.Web.Controllers.ComputerController.AddComputer(ComputerModel model) in C:\Users\katelyn\Documents\my Web Project\myWebPortal.Web\Controllers\ComputerController.cs:71
lambda_method(ExecutionScope , ControllerBase , Object[] ) +69
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +236
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +31
System.Web.Mvc.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() +85
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +632195
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +288
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +630660
System.Web.Mvc.Controller.ExecuteCore() +125
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +48
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +15
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +85
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +51
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +454
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +263
Также при попытке добавить ноутбук/рабочий стол иногда вставлялась строка «Компьютер», но не строка «Ноутбук/рабочий стол».
OptimisticConcurrencyException
, если у вас нет поля, гдеConcurrencyMode
равноFixed
. Вы не показываете этого и не показываете код, который компилируется, или сгенерированный SQL. Если вам нужна помощь, вы должны предоставить реальный код и модель, которые вы используете, а не выдуманный пример, который, по вашему мнению, может отражать то, что вы делаете. - person Craig Stuntz   schedule 01.03.2010catch
не может изменить тип исключения, если только он не выдает совершенно новое исключение (и я предполагаю, что вы проверили это). Если вы видитеOptimisticConcurrencyException
, значит где-то в каком-то полеConcurrencyMode
установлено наFixed
. Эта функция предназначена для управления оптимистичным параллелизмом с помощью, например, столбца SQL ServerTIMESTAMP
. Чтобы просмотреть SQL, сгенерированный EF, используйте SQL Profiler. Это покажет вам операторUPDATE
, который должен пояснить, почему он на самом деле не обновляет никаких данных. - person Craig Stuntz   schedule 01.03.2010INSERT
SQL в SQL Server Management Studio и посмотреть, сообщает ли он об изменении 1 строки (так и должно быть). - person Craig Stuntz   schedule 02.03.2010