我首先有带有实体框架代码的 MVC Web 应用程序项目。在这个项目中,我将使用通用存储库和工作单元模式。另外我想使用存储过程来获取列表和get-list
方法。
如何使用具有通用存储库和工作单元模式的存储过程?
我首先有带有实体框架代码的 MVC Web 应用程序项目。在这个项目中,我将使用通用存储库和工作单元模式。另外我想使用存储过程来获取列表和get-list
方法。
如何使用具有通用存储库和工作单元模式的存储过程?
到您的通用存储库添加
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 }
);
您不应该尝试将 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);
}
}
对于通用存储库添加:
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();
}
如果您使用的是 .net core 3.1,则必须解决
您将创建一个将携带存储过程结果的类
您将从 DBcontext 创建另一个部分类,并将前一个类放入其中
您将创建IStoredProcedure
接口并使用泛型在存储过程中实现它
在启动类中注入您的存储过程类
不要忘记使您的结果类字段与结果表单存储过程相同
执行存储过程
执行:
(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();