12

我首先有带有实体框架代码的 MVC Web 应用程序项目。在这个项目中,我将使用通用存储库和工作单元模式。另外我想使用存储过程来获取列表和get-list方法。

如何使用具有通用存储库和工作单元模式的存储过程?

4

4 回答 4

21

到您的通用存储库添加

public IEnumerable<T> ExecWithStoreProcedure(string query, params object[] parameters)
{
        return _context.Database.SqlQuery<T>(query, parameters);
}

然后您可以使用任何工作单元/存储库来调用它,例如

IEnumerable<Products> products = 
             _unitOfWork.ProductRepository.ExecWithStoreProcedure(
             "spGetProducts @bigCategoryId",
             new SqlParameter("bigCategoryId", SqlDbType.BigInt) { Value = categoryId } 
      );
于 2013-08-01T18:42:34.957 回答
10

您不应该尝试将 SP 与 UoW/Repository 模式一起使用,因为它们很难在代码中控制,并且通常不会映射回相同的实体类型。UoW 和存储库模式更适合直接使用 ADO.NET 而不是实体框架,因为EF 已经是存储库模式。在使用 SP 时,我建议将 CQRS 作为更好的模式。在详细说明@sunil 的答案和我对此的评论后,我创建了一个专门用于处理存储过程的类。它也很容易模拟和测试。

public class ProcedureManager : IProcedureManager
{
    internal DbContext Context;

    public ProcedureManager(DbContext context)
    {
        Context = context;
    }

    //When you expect a model back (async)
    public async Task<IList<T>> ExecWithStoreProcedureAsync<T>(string query, params object[] parameters)
    {
        return await Context.Database.SqlQuery<T>(query, parameters).ToListAsync();
    }

    //When you expect a model back
    public IEnumerable<T> ExecWithStoreProcedure<T>(string query)
    {
        return Context.Database.SqlQuery<T>(query);
    }

    // Fire and forget (async)
    public async Task ExecuteWithStoreProcedureAsync(string query, params object[] parameters)
    {
        await Context.Database.ExecuteSqlCommandAsync(query, parameters);
    }

    // Fire and forget
    public void ExecuteWithStoreProcedure(string query, params object[] parameters)
    {
        Context.Database.ExecuteSqlCommand(query, parameters);
    }
}
于 2015-01-27T12:00:50.407 回答
2

对于通用存储库添加:

  public IEnumerable<TEntity> GetdataFromSqlcommand(string command, System.Data.SqlClient.SqlParameter[] parameter)
    {
        StringBuilder strBuilder = new StringBuilder();
        strBuilder.Append($"EXECUTE {command}");
        strBuilder.Append(string.Join(",", parameter.ToList().Select(s => $" @{s.ParameterName}")));

        return Context.Set<TEntity>().FromSql(strBuilder.ToString(), parameter);
    }

你只需要发送存储过程名称和参数数组:

public IEnumerable<MainData> GetMainData(Param query)
{
    var param1 = new SqlParameter("param1", query.param1);
    var param2 = new SqlParameter("param2", query.param2);
    return GetdataFromSqlcommand("StoredProcedurename", parameter: new[] { param1, param2 }).ToList();
}
于 2017-01-23T09:58:29.133 回答
1

如果您使用的是 .net core 3.1,则必须解决

  1. 您将创建一个将携带存储过程结果的类

  2. 您将从 DBcontext 创建另一个部分类,并将前一个类放入其中

  3. 您将创建IStoredProcedure接口并使用泛型在存储过程中实现它

  4. 在启动类中注入您的存储过程类

  5. 不要忘记使您的结果类字段与结果表单存储过程相同

  6. 执行存储过程

执行:

(1)第一步

public class TaskPercents
{
    public long Id { get; set; }
    public long SchoolRepId { get; set; }

    public string Name { get; set; }
}

(2)第二步

public partial class SchoolsPartnershipDBContext : DbContext
{
    public virtual DbSet<TaskPercents> TaskPercents { get; set; }
}

(3)第三步

public interface IStoredProcedure<T> 
{
    public List<T> ExecuteStored(string query);
}

{
    private SchoolsPartnershipDBContext _context;

    public StoredProcedure(SchoolsPartnershipDBContext Context)
    {
        _context = Context;
    }

    public List<T> ExecuteStored(string query)
    {
        //Context = new SchoolsPartnershipDBContext();
        var r = _context.Set<T>().FromSqlRaw(query);
        return r.ToList();
        // return null;
    }
}

最后一步

        var result = _storedProcedure.ExecuteStored("TaskExecPercentForSchoolRep");
        return result.ToList();
于 2020-02-03T06:02:28.760 回答