Entity framework 使用DbParameter而不是SqlParameter与_context.Database.SqlQuery一起执行存储过程

Entity framework 使用DbParameter而不是SqlParameter与_context.Database.SqlQuery一起执行存储过程,entity-framework,repository,sqlparameter,Entity Framework,Repository,Sqlparameter,我使用的是实体框架6.1和GenericRepository。为了执行存储过程,我使用SqlQuery方法。目前我正在使用SqlParameters,但作为一个GenericRepository,我不想使用某些特定的类。我尝试了多个选项,但如何在此处使用DbParameter。我试图从dbcontext访问providerName(System.Data.SqlClient),但也不可用。任何方向都会有帮助。如果你想让我提供更多信息,请告诉我 public IEnumerable<

我使用的是实体框架6.1和GenericRepository。为了执行存储过程,我使用SqlQuery方法。目前我正在使用SqlParameters,但作为一个GenericRepository,我不想使用某些特定的类。我尝试了多个选项,但如何在此处使用DbParameter。我试图从dbcontext访问providerName(System.Data.SqlClient),但也不可用。任何方向都会有帮助。如果你想让我提供更多信息,请告诉我

    public IEnumerable<T> GetAllFromStoredProcedure(string storedProcedureName, List<StoredProcedureParameter> parameters)
    {
        List<SqlParameter> sqlParameters = new List<SqlParameter>();

        foreach (StoredProcedureParameter parameter in parameters)
        {
            sqlParameters.Add(new SqlParameter(parameter.Name, parameter.Type) { Value = parameter.Value});
        }

        return _context.Database.SqlQuery<T>(storedProcedureName, sqlParameters.ToArray());
    }
我为此做了什么-

在我的域项目中(首先使用数据库中的代码创建上下文和实体),我添加了一个类StoredProcedureParameter-

public class StoredProcedureParameter
{
    public string Name { get; set; }
    public DbType Type { get; set; }
    public object Value { get; set; }

    public static object[] CreateParameters(List<StoredProcedureParameter> parameters)
    {
        List<SqlParameter> sqlParameters = new List<SqlParameter>();

        foreach (StoredProcedureParameter parameter in parameters)
        {
            sqlParameters.Add(new SqlParameter(parameter.Name, parameter.Type) { Value = parameter.Value });
        }

        return sqlParameters.ToArray();
    }
}
公共类存储过程参数
{
公共字符串名称{get;set;}
公共DbType类型{get;set;}
公共对象值{get;set;}
公共静态对象[]CreateParameters(列表参数)
{
List sqlParameters=new List();
foreach(参数中的StoredProcedureParameter参数)
{
添加(新的SqlParameter(parameter.Name,parameter.Type){Value=parameter.Value});
}
返回sqlParameters.ToArray();
}
}
然后在我的存储库项目(具有GenericRepository和UnitOfWork)中,我添加了一个新方法-

    public IEnumerable<T> GetAllFromStoredProcedure(string storedProcedureName, List<StoredProcedureParameter> parameters)
    {
        return _context.Database.SqlQuery<T>(storedProcedureName, StoredProcedureParameter.CreateParameters(parameters));
    }
public IEnumerable GetAllFromStoredProcedure(字符串storedProcedureName,列表参数)
{
返回_context.Database.SqlQuery(storedProcedureName,StoredProcedureParameter.CreateParameters(parameters));
}
现在,当调用Repository->GetAllFromStoredProcedure方法(从我的应用程序项目)时,我将从Domain->StoredProcedureParameter->CreateParameters方法创建参数列表。这可以确保传递的参数类型正确,我的GenericRepository保持通用,我的应用程序项目也不受影响

    public IEnumerable<T> GetAllFromStoredProcedure(string storedProcedureName, List<StoredProcedureParameter> parameters)
    {
        return _context.Database.SqlQuery<T>(storedProcedureName, StoredProcedureParameter.CreateParameters(parameters));
    }