Dapper 扩展将数据插入 SQL Server

问题描述 投票:0回答:2

数据库表:

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

我得到这个错误:

enter image description here

System.ArgumentException: 'System.Int64' 类型的对象无法转换为 'System.Int32' 类型。'

我在页面上显示此异常,但数据已成功插入数据库。我的数据库数据类型和模型类数据类型都是一样的,但我仍然在页面上看到这个“转换错误”

我需要在 ASP.NET Core Razor 页面中使用 Dapper Extension 向数据库表中插入一个新行

enter image description here

c# sql-server asp.net-core-mvc dapper dapper-extensions
2个回答
0
投票

我在页面上显示了这个异常,但是数据被插入到数据库中 成功地。我的数据库数据类型和模型类数据类型都是 一样,但我仍然在页面上看到这个“转换错误”

嗯,一开始我以为你在做一些傻事。出于我的好奇心,我进入了它并且知道问题不在你的代码中它的

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

注意: 请根据您的场景和上下文更新代码片段。

输出:

注意: 此外,根据堆栈跟踪,如果有人有确切的解释或发现,请告诉我。我很高兴更新我的答案。


0
投票

型号:

[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。

© www.soinside.com 2019 - 2024. All rights reserved.