数据库表:
CREATE TABLE [dbo].[EmployeeDetails]
(
[id] [int] PRIMARY KEY IDENTITY(1,1) NOT NULL,
[Name] [varchar](max) NULL,
[Emailid] [varchar](max) NULL,
[department] [varchar](max) NULL,
[Salary] [int] NULL,
[Profile] [varchar](max) NULL,
[Description] [varchar](max) NULL,
[ReferencesId] [int] NULL
)
模特班:
public class Employee
{
#region properties
public int Id { get; set; }
public string? Name { get; set; }
public string? Emailid { get; set; }
public string? department { get; set; }
public int salary { get; set; }
public string? Profile { get; set; }
public string? Description { get; set; }
#endregion
}
类映射器
public class EmployeeMapper : ClassMapper<Employee>
{
public EmployeeMapper()
{
Table("EmployeeDetails");
Map(x => x.Id).Key(KeyType.Identity).Column("Id").Type(System.Data.DbType.Int32);
Map(x => x.Name).Column("Name");
Map(x => x.Emailid).Column("Emailid");
Map(x => x.department).Column("department");
Map(x => x.salary).Column("Salary");
Map(x => x.Profile).Column("Profile");
Map(x => x.Description).Column("Description");
}
}
插入代码:
public int Add(T entity)
{
int count = 0;
using (var con = _dapperContext.CreateConnection())
{
int id = con.Insert(entity);
if (id > 0)
{
count++;
}
}
return count;
}
我得到这个错误:
System.ArgumentException: 'System.Int64' 类型的对象无法转换为 'System.Int32' 类型。'
我在页面上显示此异常,但数据已成功插入数据库。我的数据库数据类型和模型类数据类型都是一样的,但我仍然在页面上看到这个“转换错误”
我需要在 ASP.NET Core Razor 页面中使用 Dapper Extension 向数据库表中插入一个新行
我在页面上显示了这个异常,但是数据被插入到数据库中 成功地。我的数据库数据类型和模型类数据类型都是 一样,但我仍然在页面上看到这个“转换错误”
嗯,一开始我以为你在做一些傻事。出于我的好奇心,我进入了它并且知道问题不在你的代码中它的
Dapper-Extensions
问题。我对他们的文档进行了很长时间的调查,似乎是旧版本,目前他们不支持它。 这个官方文档我看过了
问题转载:
我已经重现了
Dapper-Extensions
方法抛出的问题,如下所示:
Dapper 扩展方法:
例外:
堆栈跟踪:
at System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast)
at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
at DapperExtensions.DapperImplementor.InternalInsert[T](IDbConnection connection, T entity, IDbTransaction transaction, Nullable`1 commandTimeout, IClassMapper classMap, IList`1 nonIdentityKeyProperties, IMemberMap identityColumn, IMemberMap triggerIdentityColumn, IList`1 sequenceIdentityColumn)
at DapperExtensions.DapperImplementor.Insert[T](IDbConnection connection, T entity, IDbTransaction transaction, Nullable`1 commandTimeout)
at MVCApps.Controllers.UserLogController.Add() in D:\MyComputer\MsPartnerSupport\MVCApps\Controllers\UserLogController.cs:line 1371
at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()
注:
在调试和重现问题时,我尝试在两侧都使用
int
数据类型以及其他数据类型,例如 bigint
但仍然发生转换错误,我发现这个问题在以下方面是已知的Dapper-Extensions
。因此,一种数据类型相应地计算出来,即GUID
。我仍然不确定,这些Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast
是如何干预这里的。
解决方案:
截至目前,
int
,bigint
总是抛出'Object of type 'System.Int64' cannot be converted to type 'System.Int32'.'
因此,原因尚不清楚哪个来自DapperExtensions.DapperExtensions.Insert()
方法。
此外,为了避免上述错误,我们可以这样做:
POCO型号:
public class Employee
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Emailid { get; set; }
public string Department { get; set; }
public int Salary { get; set; }
}
注:
除了
Guid
目前不工作,我不确定这背后的原因。所以如果你想坚持你的实施,你可以考虑Guid
.
数据库架构:
CREATE TABLE Employee(
[Id] UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
[Name] [varchar](25) NULL,
[Emailid] [varchar](100) NULL,
[Department] [varchar](25) NULL,
[Salary] [int] NULL,
)
Asp.Net 核心控制器/存储库方法:
public int Add()
{
int count = 0;
Employee employee = new Employee();
employee.Name = "Kudiya";
employee.Emailid = "[email protected]";
employee.Department = "Dapper";
employee.Salary = 500;
using (SqlConnection conn = new SqlConnection(_connectionString))
{
conn.Insert(employee);
Guid Id = employee.Id;
if (Id != null)
{
count++;
}
}
return count;
}
注意: 请根据您的场景和上下文更新代码片段。
输出:
注意: 此外,根据堆栈跟踪,如果有人有确切的解释或发现,请告诉我。我很高兴更新我的答案。
型号:
[Table("ClientAccount")] public class ClientAccount { public long ID { get; set; } }
资料库:
using (IDbConnection conn = GetConnection()) { var result = await conn.InsertAsync<ClientAccount>(clientAccount); }
以上对我有用。 而不是 int,我使用 long 作为 ID 列 在存储库中,得到的结果是 var 而不是 int。