Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 使用Dapper在数据库中执行动态实体_Asp.net_Asp.net Core_Dapper - Fatal编程技术网

Asp.net 使用Dapper在数据库中执行动态实体

Asp.net 使用Dapper在数据库中执行动态实体,asp.net,asp.net-core,dapper,Asp.net,Asp.net Core,Dapper,我的用户从客户端项目发送动态实体,所以,我必须编写如下方法 public Task<TUser> FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new NotImplementedException();

我的用户从客户端项目发送动态实体,所以,我必须编写如下方法

public Task<TUser> FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken)
    {
        cancellationToken.ThrowIfCancellationRequested();
        throw new NotImplementedException();
        //string sql = "SELECT * FROM \"IdentityUsers\" WHERE \"NormalizedUserName\" = @NormalizedUserName;";
        //using (var connection =  _databaseConnectionFactory.CreateConnectionAsync())
        //{
        //   connection.QueryFirstOrDefaultAsync<TUser>(sql,
        //        new { NormalizedUserName = normalizedUserName });
        //}
    }
public Task FindByNameAsync(字符串normalizedUserName,CancellationToken CancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
抛出新的NotImplementedException();
//string sql=“从\“IdentityUsers\”中选择*,其中\“NormalizedUserName\”=@NormalizedUserName;”;
//使用(var connection=\u databaseConnectionFactory.CreateConnectionAsync())
//{
//connection.QueryFirstOrDefaultAsync(sql,
//新的{NormalizedUserName=NormalizedUserName});
//}
}
MyIDatabaseConnectionFactory类绑定连接字符串如下:

public interface IDatabaseConnectionFactory
{       
    Task<IDbConnection> CreateConnectionAsync();
}

public class ConnectionFactory : IDatabaseConnectionFactory
{
    private readonly string _connectionString;

    public ConnectionFactory(string connectionString) => _connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));

    public async Task<IDbConnection> CreateConnectionAsync()
    {
        try
        {
            var connString =  new NpgsqlConnection(_connectionString);
            await connString.OpenAsync();
            return connString;
        }
        catch
        {
            throw;
        }
    }
}
公共接口IDatabaseConnectionFactory
{       
任务CreateConnectionAsync();
}
公共类连接工厂:IDatabaseConnectionFactory
{
私有只读字符串_connectionString;
public ConnectionFactory(string connectionString)=>\u connectionString=connectionString??抛出新参数nullexception(nameof(connectionString));
公共异步任务CreateConnectionAsync()
{
尝试
{
var connString=新的NpgsqlConnection(_connectionString);
等待connString.OpenAsync();
返回字符串;
}
抓住
{
投掷;
}
}
}
现在,如何使用泛型类型entityTUser执行以下查询

  string sql = "SELECT * FROM \"IdentityUsers\" WHERE \"NormalizedUserName\" = @NormalizedUserName;";
    using (var connection =  _databaseConnectionFactory.CreateConnectionAsync())
    {
       connection.QueryFirstOrDefaultAsync<TUser>(sql,
            new { NormalizedUserName = normalizedUserName });
    }
string sql=“从\“IdentityUsers\”中选择*,其中\“NormalizedUserName\”=@NormalizedUserName;”;
使用(var connection=\u databaseConnectionFactory.CreateConnectionAsync())
{
connection.QueryFirstOrDefaultAsync(sql,
新的{NormalizedUserName=NormalizedUserName});
}

注意:QueryFirstOrDefaultAsync未在此处的连接下找到

您没有等待
CreateConnectionAsync
。不幸的是,这种情况并不明显,因为
任务
是一次性的(因此
使用
不会抱怨);请尝试:

使用(var connection=await\u databaseConnectionFactory.CreateConnectionAsync())
{
var user=await connection.QueryFirstOrDefaultAsync(sql,
新的{NormalizedUserName=NormalizedUserName});
}
提示:编译器输出(针对原始代码)有助于明确这一点:

错误CS1929“
Task
”不包含“
QueryFirstOrDefaultAsync
”和最佳扩展方法重载“
SqlMapper”的定义。QueryFirstOrDefaultAsync(IDbConnection,string,object,IDbTransaction,int?,CommandType?
”需要类型为“
IDbConnection
”的接收器

这告诉我们:

  • 它找到了一些
    QueryFirstOrDefaultAsync
    方法,但它不可用,因为
  • 目标表达式是
    任务
    ,而不是
    IDB连接

作为旁注:值得一提的是,如果您只对连接执行一个操作,Dapper可以为您打开和关闭连接,这有助于减少异步/等待操作的数量。例如,如果您有一个<代码> CREATECOFED连接()/<代码>方法> <强>没有< /强>打开连接,因此不需要是异步的;以下措施仍然有效:

使用(var connection=\u databaseConnectionFactory.CreateClosedConnection())
{
var user=await connection.QueryFirstOrDefaultAsync(sql,
新的{NormalizedUserName=NormalizedUserName});
}

使用Dapper处理
wait OpenAsync()
作为
QueryFirstOrDefaultAsync

的一部分,如果找不到,听起来您缺少使用Dapper的
在顶部,不是吗?@MarcGravell不,亲爱的,用简洁的语言;存在于文件中。