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, woConcurrencyMode
istFixed
. 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 sehenOptimisticConcurrencyException
dann einige Gebiet hat irgendwo seineConcurrencyMode
eingestelltFixed
. 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 dieUPDATE
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).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wo sind Sie Instanziierung/Initialisierung
entityToAdd
?Können Sie bestätigen, dass der foreign key-Einschränkungen und Primärschlüssel-Informationen (auto-increment, Typ, etc.) Es scheint, dass das insert fehlschlägt, für einige Grund, der ist gefangen von der falschen Anzahl der betroffenen Zeilen.
versuchen, das SQL selbst innerhalb von sql management console - bekommst du irgendwelche Fehler? ist der Datensatz korrekt eingefügt?
Können Sie auch wollen, um sicherzustellen, gibt es keine Trigger oder ähnliches auf den Tisch, die können Probleme verursachen.
SavingChanges
die möglicherweise von Interesse für Sie sein.Habe ich erlebt das gleiche problem vor, und es wurde verursacht durch einen INSTEAD OF-trigger in SQL Server. Es scheint mir, dass OptimisticConcurrencyExceptions auftreten, wenn der SQL Server meldet, dass die Abfrage erfolgreich durchgeführt, aber das Verfahren SELECT-Anweisung nicht zurück, die erwartete Anzahl der Zeilen.
@mrunge einen link zu die Lösung, die ich gepostet für das problem in die Kommentare @BasicLife Antwort.
Eine weitere mögliche Ursache ist eine gespeicherte Prozedur, die verwendet wird, für Einfügungen und Aktualisierungen für Ihre Entität. Von http://msdn.microsoft.com/en-us/library/bb738618.aspx:
Bin ich ziemlich sicher, dass die tatsächliche SQL-Fehler (key-Verletzungen, null-Fehler, etc.) , die auftreten, während der normalen Ausführung der SQL-Abfrage ausgegeben wird berichtet, mit einer anderen Ausnahme, als die Sie sah. Ich kann mich nicht erinnern, den Namen der Ausnahme obwohl.