einfügen mithilfe von linq-to-entities

Hallo, ich habe Probleme bei der Lösung dieses Fehlers. Keine Hilfe auf das problem würde sehr geschätzt, danke!

Fehlermeldung:

Store update -, insert-oder delete-Anweisung betroffenen eine unerwartete Anzahl von Reihen (0). Entitäten können geändert oder gelöscht wurden, da Personen geladen wurden. Aktualisieren ObjectStateManager Einträge.

Immer wenn ich versuche, fügen Sie ein Laptop/Desktop, bekomme ich die obige Fehlermeldung.

Funktioniert alles wunderbar, wenn lokal ausgeführt werden, aber nicht auf dev. Die website und service/Datenbank auf zwei verschiedenen dev-Boxen.

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

Hier ist der stack trace:

Wurde eine unbehandelte Ausnahme generiert
während der Ausführung der aktuellen
web-Anfrage. Informationen über die
Ursprung und Speicherort der Ausnahme
identifiziert werden können, mit Ausnahme
stack-trace-unter.

Stack Trace:

[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

Auch wenn Sie versuchen, um einen Laptop/Desktop, manchmal ein Computer Zeile eingefügt würde, aber nicht einen Laptop/Desktop-Reihe.

  • Du wirst nie sehen OptimisticConcurrencyException es sei denn, Sie haben ein paar Felder, wo ConcurrencyMode ist Fixed. Sie zeigen nicht, dass, noch zeigst du code, der kompiliert oder die SQL generiert wird. Wenn Sie Hilfe möchten, sollten Sie den richtigen code und Modell, die Sie verwenden, nicht eine erfundene Beispiel, das Sie vielleicht denken, das reflektieren, was du tust.
  • Ich habe nicht ConcurrencyMode nirgendwo eingestellt. Ich denke, es ist OptimisticConcurrencyException da ist es gefangen in der catch(OptimisticConcurrencyException e) zu blockieren. Und das ist der eigentliche code. Und was die generierte SQL? Sorry, neues zu der ganzen Sache hier und versuche nur zu spielen mit linq-to-entities.
  • Nein, ein catch block kann nicht ändern Sie den Typ einer Ausnahme, es sei denn, es wirft eine ganz neue Ausnahme (und ich nehme an, Sie überprüft, dass). Wenn Sie sehen OptimisticConcurrencyException dann einige Gebiet hat irgendwo seine ConcurrencyMode eingestellt Fixed. Die Absicht, die Funktion ist für optimistic concurrency control über, z.B., eine SQL Server - TIMESTAMP Spalte. Zum anzeigen der generierte SQL von der EF, verwenden Sie SQL Profiler. Das zeigen Ihnen die UPDATE Aussage, die klären sollten, warum es nicht eigentlich Aktualisierung der Daten.
  • Danke. Ich fügte hinzu, das SQL generiert und bearbeitet ich meinen code, um das Konzept klarer.
  • Dennoch sehe ich nicht das problem -- was Sie tun, in der überarbeitete code sieht OK. Hinzufügen Sie können einen stack-trace der exception?
  • Nur noch einen stack-trace, danke.
  • Danke, aber das ist die Spur, die aus Ihrer web-app. Es scheint mir, du bist remoting zu einem anderen Prozess. Die Ausnahme wird ausgelöst, da, so dass die Stapel, die wir brauchen, zu betrachten. Eine andere Sache zu versuchen ist auszuführen, dass INSERT im SQL Server Management Studio, und sehen, ob es Berichte 1 Zeile geändert (es sollte).

InformationsquelleAutor user283802 | 2010-03-01
Schreibe einen Kommentar