使用 Dapper.Contrib 和 InsertAsync 编写通用 InsertData 方法

Writing a generic InsertData method using Dapper.Contrib and InsertAsync

我对 C# 和 Dapper 还很陌生。我正在尝试为我的项目编写一个通用的插入数据方法。我来自 Delphi 环境,所以我仍在寻找 C# 的出路。

Dapper 使用起来似乎相当简单,但我遇到了一些挑战。我已经尝试了各种方法来使用以下代码获得正确的语法,但都没有成功。

问题似乎围绕着 T(我仍然不太明白 T 是什么)以及我拥有的所有组合试过不行。

public async Task<int> InsertData<T>(T list)
{
    string connectionString = _config.GetConnectionString(ConnectionStringName);

    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return await connection.InsertAsync<int>(list);
    }
}

以下代码确实有效,那么我哪里出错了?

public async Task SaveData<T>(string sql, T parameters)
{
    string connectionString = _config.GetConnectionString(ConnectionStringName);

    using (IDbConnection connection = new SqlConnection(connectionString))
    {
            await connection.ExecuteAsync(sql, parameters);
    }
}

您的第二个代码 (await connection.ExecuteAsync(sql, parameters);) 有效,因为您只是在执行您手写的 SQL 语句。方法ExecuteAsync属于Dapper;不是 Dapper.Contrib。通用 T 用于 parameters,不适用于您要插入的对象。

对于您的第一个代码 (return await connection.InsertAsync<int>(list);),您实际上使用的是 Dapper.Contrib;您不是手写 SQL 语句。 Dapper.Contrib 为您生成。

您的以下代码似乎是问题所在:

return await connection.InsertAsync<int>(list);

您正在将通用参数 <int> 传递给没有意义的方法。

我还没有对此进行测试,但我希望将该行更改为以下行应该可行:

return await connection.InsertAsync<T>(list);

此外,您必须通过向其添加 where T : class 来确保通用类型 T 是 class。

以下通用方法应该符合您的目的;您需要将其转换为 async 以匹配您当前的代码:

public void InsertData<T>(T entity) where T : class
{
    string connectionString = ....;

    using(IDbConnection connection = new SqlConnection(connectionString))
    {
        long result = connection.Insert<T>(entity);
    }
}

我不理解你代码中的其他几个部分。说 InsertData<T>(T list)。什么是 list?它是作为单个对象还是对象列表?如果它是对象列表,List<T> list 更有意义。如果它是单个对象,最好将 list 重命名为实际对象名称,例如 T customer/entity/poco