0

こんにちは、このエラーを解決できません。問題に関するヘルプは大歓迎です、ありがとう!

エラーメッセージ:

Store update、insert、または delete ステートメントが予期しない数の行 (0) に影響を与えました。エンティティが読み込まれてから、エンティティが変更または削除された可能性があります。ObjectStateManager エントリを更新します。

ラップトップ/デスクトップを追加しようとすると、常に上記のエラー メッセージが表示されます。
ローカルで実行している場合はすべて正常に動作しますが、dev では動作しません。Web サイトとサービス/データベースは、2 つの異なる開発ボックスにあります。

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

スタック トレースは次のとおりです。

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[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

また、ラップトップ/デスクトップを追加しようとすると、コンピューターの行が挿入されても、ラップトップ/デスクトップの行が挿入されないことがあります。

4

2 に答える 2

1

どこでインスタンス化/初期化していますentityToAddか?

外部キー制約と主キー情報(自動インクリメント、タイプなど)を確認できますか。影響を受ける行数が正しくないことが原因で、挿入が何らかの理由で失敗しているようです。

SQL 管理コンソール内から自分で SQL を実行してみてください。エラーは発生しますか? レコードは正しく挿入されていますか?

また、問題を引き起こしている可能性のあるトリガーや同様のものがテーブルにないことを確認することもできます。

于 2010-09-20T22:24:00.060 に答える
1

以前にも同じ問題が発生しましたが、SQL Server の INSTEAD OF トリガーが原因でした。クエリが正常に完了したことを SQL Server が報告したときに OptimisticConcurrencyExceptions が発生するように思えますが、進行中の SELECT ステートメントは予想される行数を返しません。

@mrunge は、 @BasicLife の回答のコメントで、その問題について投稿したソリューションへのリンクを提供しました。

別の潜在的な原因は、エンティティの挿入と更新に使用されるストアド プロシージャです。http://msdn.microsoft.com/en-us/library/bb738618.aspxから:

OptimisticConcurrencyException は、ストアド プロシージャを使用してデータ ソースを更新するエンティティ データ モデルを定義するときにも発生する可能性があります。この場合、更新を実行するために使用されるストアード・プロシージャーがゼロ行が更新されたことを報告すると、例外が発生します。

によって発行された SQL クエリの通常の実行中に発生する実際の SQL エラー (キー違反、null エラーなど) は、見たものとは異なる例外を使用して報告されると確信しています。ただし、例外の名前を思い出せません。

于 2011-06-22T00:14:05.523 に答える