我是唯一使用这个系统的用户,这段代码抛出一个并发异常,我所要做的就是更新状态并添加采用该任务的用户
OptimisticConcurrencyException:存储update、insert或delete语句影响到意外的行数(0)。实体可能已被修改或删除,因为实体是加载的。有关理解和处理乐观并发异常的信息,请参见http://go.microsoft.com/fwlink/?LinkId=472540。
namespace GoldMine.View.Notification.Home.Process {
using PageInstruction = GraphiteGTC.Core.View.Element.Model.PageInstruction;
using Notification = GoldMine.Model.Notification;
using User = GoldMine.Model.User;
using NotificationApprovalStatus = GoldMine.Model.NotificationApprovalStatus;
using ButtonTypeOption = GoldMine.Model.ButtonTypeOption;
/// <summary>
///
/// Class housing the logic for OnClickAdoptApproveTaskButtonProcess
///
/// </summary>
public class OnClickAdoptApproveTaskButtonProcess : GoldMineViewProcess {
/// <summary>
///
/// View process inputs
///
/// </summary>
public new OnClickAdoptApproveTaskButtonProcessInputs Inputs {
get { return ( OnClickAdoptApproveTaskButtonProcessInputs )base.Inputs; }
set { base.Inputs = value; }
}
/// <summary>
///
/// View process outputs
///
/// </summary>
public new OnClickAdoptApproveTaskButtonProcessOutputs Outputs {
get { return ( OnClickAdoptApproveTaskButtonProcessOutputs )base.Outputs; }
set { base.Outputs = value; }
}
/// <summary>
///
/// UI outputs
///
/// </summary>
public OnClickAdoptApproveTaskButtonProcessUiOutputs UiOutputs {
get { return new OnClickAdoptApproveTaskButtonProcessUiOutputs( Outputs ); }
}
/// <summary>
///
/// Default parameter-less constructor
///
/// </summary>
public OnClickAdoptApproveTaskButtonProcess() {
Name = "GoldMine.View.Notification.Home.Process.OnClickAdoptApproveTaskButtonProcess";
Inputs = new OnClickAdoptApproveTaskButtonProcessInputs();
Outputs = new OnClickAdoptApproveTaskButtonProcessOutputs();
base.Outputs = Outputs;
base.Inputs = Inputs;
DelayedPropertyAssignments = new List<DelayedPropertyAssignment>();
}
/// <summary>
///
/// Entry point for event processing
///
/// </summary>
protected override GraphiteGTCProcess ExecuteProcess( GTCEventRegistration executingEventRegistration ) {
return base.ExecuteProcess( Inputs.EventRegistration );
}
/// <summary>
///
/// Entry point for Business Logic Processing
///
/// </summary>
protected override GraphiteGTCProcess ExecuteForwardProcessing() {
try {
Outputs = new OnClickAdoptApproveTaskButtonProcessOutputs();
Outputs.SessionToken = UiStringConverter.CreateSessionToken( Inputs.CurrentUser );
Debugging.DebugWorker.Current.BeginProcess();
Debugging.DebugWorker.Current.SetVariableValue( "ButtonType", Inputs.ButtonType );
Debugging.DebugWorker.Current.SetVariableValue( "CurrentNotification", Inputs.CurrentNotification );
Debugging.DebugWorker.Current.SetVariableValue( "PageInstructions", Outputs.PageInstructions );
Debugging.DebugWorker.Current.SetVariableValue( "CurrentUser", Inputs.CurrentUser );
Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "092c84bf-423e-454b-8efa-00749bc691ef" );
// ShapeComment:[Create List of Page Instructions][b60bbb93-3a06-4a57-ace3-6024f91c94a0][4bf395e3-e0a1-4304-b987-dcdae594a524]
Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "4bf395e3-e0a1-4304-b987-dcdae594a524" );
Outputs.PageInstructions = new List<PageInstruction>();
Debugging.DebugWorker.Current.SetVariableValue( "PageInstructions", Outputs.PageInstructions );
// ShapeComment:[Get Receiver][b60bbb93-3a06-4a57-ace3-6024f91c94a0][6b9c89cc-79c7-4957-8164-9a0c25da7652]
Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "6b9c89cc-79c7-4957-8164-9a0c25da7652" );
#region Execute FindReceiverFromNotification Process
var notificationFindReceiverFromNotificationProcess = new Notification( true ).FindReceiverFromNotificationProcess;
notificationFindReceiverFromNotificationProcess.Inputs.EventRegistration = Inputs.EventRegistration;
notificationFindReceiverFromNotificationProcess.Inputs.CurreuntUser = Inputs.CurrentUser;
notificationFindReceiverFromNotificationProcess.Inputs.Notification = Inputs.CurrentNotification;
notificationFindReceiverFromNotificationProcess.OverriddenValidations = OverriddenValidations;
try {
notificationFindReceiverFromNotificationProcess.StartProcessing();
Outputs.Validations.AddRange( notificationFindReceiverFromNotificationProcess.Outputs.Validations );
}
catch ( ValidationResultException validationResultException ) {
Outputs.Validations.AddRange( validationResultException.Validations );
if ( validationResultException.ContainsError() ) {
throw new ValidationResultException( string.Format( "Processing {0} resulted in an error", Name ), Outputs.Validations );
}
}
#endregion
var NotificationFindReceiverFromNotificationResult = notificationFindReceiverFromNotificationProcess;
Debugging.DebugWorker.Current.SetVariableValue( "NotificationFindReceiverFromNotificationResult", NotificationFindReceiverFromNotificationResult );
// ShapeComment:[Assign Notification as Read][b60bbb93-3a06-4a57-ace3-6024f91c94a0][324e353c-cdd6-488e-8c9c-3420051a06f5]
Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "324e353c-cdd6-488e-8c9c-3420051a06f5" );
Inputs.CurrentNotification.AdoptedBy = Inputs.CurrentUser;
Inputs.CurrentNotification.ApprovalStatus = NotificationApprovalStatus.Approved;
// ShapeComment:[Save Notification][b60bbb93-3a06-4a57-ace3-6024f91c94a0][c407dd77-b074-4c26-ac9b-557d73fec312]
Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "c407dd77-b074-4c26-ac9b-557d73fec312" );
GoldMine.View.Notification.Home.Process.SaveNotificationProcess SaveNotificationProcessResult = null;
try {
SaveNotificationProcessResult = ( GoldMine.View.Notification.Home.Process.SaveNotificationProcess ) EventProcess.ExecuteUnregisteredViewEvent( "GoldMine.View.Notification.Home.Process.SaveNotificationProcess", Inputs.CurrentUser, new NameValuePairInputCollection {
{ "Notification", Inputs.CurrentNotification }
} );
Outputs.Validations.AddRange( SaveNotificationProcessResult.Outputs.Validations );
}
catch ( ValidationResultException validationResultException ) {
Outputs.Validations.AddRange( validationResultException.Validations );
if ( validationResultException.ContainsError() ) {
throw new ValidationResultException( string.Format( "Processing {0} resulted in an error", Name ), Outputs.Validations );
}
}
var HomeSaveNotificationResult = SaveNotificationProcessResult;
Debugging.DebugWorker.Current.SetVariableValue( "HomeSaveNotificationResult", HomeSaveNotificationResult );
Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "85d667f2-7ed7-4d91-9dff-1c25687fa197" );
Debugging.DebugWorker.Current.EndProcess();
Outputs.SessionToken = UiStringConverter.CreateSessionToken( Inputs.CurrentUser );
return this;
}
*catch ( ConcurrencyException ) {
throw;*
}发布于 2018-12-11 19:58:27
请注意异常消息中的这一点:
影响了意外的行数(0)
这基本上意味着“我以为我要改变什么,但我最终什么也没改变”。
这可以在像UPDATE MyTable SET MyColumn = "hi" WHERE Id = 5这样的查询中实现,但是在Id of 5中没有记录。
如果在这两行之一上抛出异常:
Inputs.CurrentNotification.AdoptedBy = Inputs.CurrentUser;
Inputs.CurrentNotification.ApprovalStatus = NotificationApprovalStatus.Approved;这意味着这些属性的setter方法正在写入数据库。属性定义如下所示:
User AdoptedBy {
get {
//something here
}
set {
//this is writing to the database
}
}出于某种原因,它正在更新一些不存在的东西。但我们不能告诉你为什么或者如何解决它而不看到代码。
因此,它取决于对任何类型的Inputs.CurrentNotification的类定义。如果它是您的类之一,那么您可能只需要调试并逐步完成该代码。
实际上,在属性getter/getter中执行任何类型的I/O操作都不是一个好主意。
https://stackoverflow.com/questions/53729982
复制相似问题