gpt4 book ai didi

c# - 亚音速 3 ActiveRecord 删除/销毁抛出奇怪的异常

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:00 27 4
gpt4 key购买 nike

我有一个带有主键 (Identity) 和几个 varchar 类型列的简单表。我尝试使用以下语法删除/销毁具有给定主键的记录:

SS3Test.DAL.TestClass.Destroy(x => x.TestId == _testId);

但是当它被调用时我得到以下异常:

无法将参数值从 Func`2 转换为 Int32。

堆栈轨迹如下:

System.InvalidOperationException was unhandled  Message="Failed to convert parameter value from a Func`2 to a Int32."  Source="SubSonic.Core"  StackTrace:       at SubSonic.Query.SqlQuery.Execute()       at SubSonic.Repository.SubSonicRepository`1.Delete(Object key, IDataProvider provider)       at SubSonic.Repository.SubSonicRepository`1.Delete(Object key)       at SS3Test.DAL.TestClass.Destroy(Func`2 expression) in E:\temp\SS3TEst\SS3Test.DAL\ActiveRecord.cs:line 2149       at SS3Test.Model.TestClass.Delete(Int32 warrantyId, Boolean destroy) in E:\temp\SS3TEst\SS3Test.Model\TestClass.cs:line 84       at SS3Test.GUI.FrmTestClass.btnDelete_Click(Object sender, EventArgs e) in E:\temp\SS3TEst\SS3Test.GUI\FrmTestClass.cs:line 72       at System.Windows.Forms.Control.OnClick(EventArgs e)       at System.Windows.Forms.Button.OnClick(EventArgs e)       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)       at System.Windows.Forms.Control.WndProc(Message& m)       at System.Windows.Forms.ButtonBase.WndProc(Message& m)       at System.Windows.Forms.Button.WndProc(Message& m)       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)       at System.Windows.Forms.Application.Run(Form mainForm)       at SS3Test.GUI.Program.Main() in E:\temp\SS3TEst\SS3Test.GUI\Program.cs:line 21       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)       at System.Threading.ThreadHelper.ThreadStart()  InnerException: System.InvalidCastException       Message="Failed to convert parameter value from a Func`2 to a Int32."       Source="System.Data"       StackTrace:            at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType)            at System.Data.SqlClient.SqlParameter.GetCoercedValue()            at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc)            at System.Data.SqlClient.SqlCommand.BuildParamList(TdsParser parser, SqlParameterCollection parameters)            at System.Data.SqlClient.SqlCommand.BuildExecuteSql(CommandBehavior behavior, String commandText, SqlParameterCollection parameters, _SqlRPC& rpc)            at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)            at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)            at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)            at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()            at SubSonic.DataProviders.DbDataProvider.ExecuteQuery(QueryCommand qry)            at SubSonic.Query.SqlQuery.Execute()       InnerException: System.InvalidCastException            Message="Object must implement IConvertible."            Source="mscorlib"            StackTrace:                 at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)                 at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType)

PS:- 我从这个答案中得到了一个解决方法,即从 db 中获取具有给定键的对象,然后对其调用 delete。它有效,但我想知道为什么我会收到此异常。我还使用 SS 3.0.3(今天(26Jan2K10)下载)。

最佳答案

这看起来像是一个正常的错误,因为 ActiveRecord Destroy 方法所依赖的 SubSonicRepository 没有 Delete(expression) 重载。

我认为如果您进入 ActiveRecord.tt 模板文件并找到:

    public static void Destroy(Func<<#=tbl.ClassName#>, bool> expression) {
var repo = GetRepo();
repo.Delete(expression);
}

并将 Delete 替换为 DeleteMany ,这将删除所有为给定表达式返回 true 的记录(如果您使用的是主键,希望只是那个 :)

GC

关于c# - 亚音速 3 ActiveRecord 删除/销毁抛出奇怪的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2141738/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com