Stored procedures 如何在asp.net内核中使用具有样板架构的存储过程?
我正在使用asp.net核心应用程序和abp(asp.net样板文件)框架。我想使用存储过程来获取数据,并在这个代码优先的体系结构中实现CRUD操作。这样做的最佳方式是什么 提前谢谢 下面是一个向存储过程发送参数以删除用户的示例: public async Task DeleteUser(EntityDto input) { await Context.Database.ExecuteSqlCommandAsync( "EXEC DeleteUserById @id", default(CancellationToken), new SqlParameter("id", input.Id) ); } 公共异步任务DeleteUser(EntityDto输入) { 等待Context.Database.ExecuteSqlCommandAsync( “EXEC DeleteUserById@id”, 默认(取消令牌), 新的SqlParameter(“id”,input.id) ); } 见: 源代码发布在Github上: 下面是一个向存储过程发送参数以删除用户的示例: public async Task DeleteUser(EntityDto input) { await Context.Database.ExecuteSqlCommandAsync( "EXEC DeleteUserById @id", default(CancellationToken), new SqlParameter("id", input.Id) ); } 公共异步任务DeleteUser(EntityDto输入) { 等待Context.Database.ExecuteSqlCommandAsync( “EXEC DeleteUserById@id”, 默认(取消令牌), 新的SqlParameter(“id”,input.id) ); } 见:Stored procedures 如何在asp.net内核中使用具有样板架构的存储过程?,stored-procedures,asp.net-core,code-first,aspnetboilerplate,Stored Procedures,Asp.net Core,Code First,Aspnetboilerplate,我正在使用asp.net核心应用程序和abp(asp.net样板文件)框架。我想使用存储过程来获取数据,并在这个代码优先的体系结构中实现CRUD操作。这样做的最佳方式是什么 提前谢谢 下面是一个向存储过程发送参数以删除用户的示例: public async Task DeleteUser(EntityDto input) { await Context.Database.ExecuteSqlCommandAsync( "EXEC DeleteUserById @id",
源代码发布在Github上:创建自定义存储库,这样您就可以访问dbcontext对象并使用此上下文执行sql查询。我在自定义存储库中创建了一些帮助器方法,希望它能帮助您:
/// <summary>
/// Map data from datareader to list object
/// </summary>
private List<T> MapToList<T>(DbDataReader reader)
{
var result = new List<T>();
if (reader.HasRows)
{
var props = typeof(T).GetRuntimeProperties();
var colMapping = reader.GetColumnSchema().Where(x => props.Any(p => p.Name.Equals(x.ColumnName, StringComparison.OrdinalIgnoreCase))).ToDictionary(key => key.ColumnName.ToLower());
while (reader.Read())
{
var item = Activator.CreateInstance<T>();
foreach (var prop in props)
{
var propValue = reader.GetValue(colMapping[prop.Name.ToLower()].ColumnOrdinal.Value);
prop.SetValue(item, propValue == DBNull.Value ? null : propValue);
}
result.Add(item);
}
}
return result;
}
//
///将数据从datareader映射到列表对象
///
私有列表映射列表(DbDataReader)
{
var result=新列表();
if(reader.HasRows)
{
var props=typeof(T).GetRuntimeProperties();
var colMapping=reader.GetColumnSchema().Where(x=>props.Any(p=>p.Name.Equals(x.ColumnName,StringComparison.OrdinalIgnoreCase)).ToDictionary(key=>key.ColumnName.ToLower());
while(reader.Read())
{
var item=Activator.CreateInstance();
foreach(道具中的var道具)
{
var propValue=reader.GetValue(colMapping[prop.Name.ToLower()].ColumnOrdinal.Value);
prop.SetValue(项,propValue==DBNull.Value?null:propValue);
}
结果.添加(项目);
}
}
返回结果;
}
//
///执行命令返回空结果
///
public int ExecuteSqlCommand(字符串sqlCommand,Dictionary@params)
{
List sqlParams=new List();
foreach(@params中的变量项)
{
如果(item.Value!=null)
添加(新的SqlParameter(item.Key,item.Value));
其他的
Add(新的SqlParameter(item.Key,DBNull.Value));
}
如果(@params.Count>0)
sqlCommand+=“”;
sqlCommand+=String.Join(“,”,@params.Select(p=>p.Key));
返回Context.Database.ExecuteSqlCommand(sqlCommand,sqlParams.ToArray());
}
//
///执行存储过程返回一组行
///
public IEnumerable ExecuteStoreProcedureWithRowsResult(字符串名称,Dictionary@params),其中TResult:class
{
//修复异常:当分配给该命令的连接处于挂起的本地事务中时,ExecuteReader要求该命令具有事务。该命令的事务属性尚未初始化。
UnitOfWorkManager.Current.Options.IsTransaction=false;
使用(var命令=Context.Database.GetDbConnection().CreateCommand())
{
var result=新列表();
字符串sqlCmd=string.Format(“{0}”,名称);
if(command.Connection.State!=System.Data.ConnectionState.Open)
command.Connection.Open();
尝试
{
foreach(@params中的变量项)
{
如果(item.Value!=null)
添加(新的SqlParameter(item.Key,item.Value));
其他的
Add(新的SqlParameter(item.Key,DBNull.Value));
command.CommandText=sqlCmd;
command.CommandType=System.Data.CommandType.StoredProcess;
使用(var reader=command.ExecuteReader())
{
结果=地图列表(读取器);
}
}
}
捕获(例外情况除外)
{
掷骰子;
}
最后
{
command.Connection.Close();
}
返回结果;
}
}
在application service中,插入自定义存储库,并可以调用存储过程,如:
var @params = new Dictionary<string, object>();
@params.Add("Id", 1);
var result = _customRepository.ExecuteStoredProcedureWithRowsResult<UserResult>("sp_getUsers", @params);
var@params=newdictionary();
@参数添加(“Id”,1);
var result=_customRepository.ExecuteStoredProcedureWithRowsResult(“sp_getUsers”,@params);
创建自定义存储库,这样您就可以访问dbcontext对象并使用此上下文执行sql查询。我在自定义存储库中创建了一些帮助器方法,希望它能帮助您:
/// <summary>
/// Map data from datareader to list object
/// </summary>
private List<T> MapToList<T>(DbDataReader reader)
{
var result = new List<T>();
if (reader.HasRows)
{
var props = typeof(T).GetRuntimeProperties();
var colMapping = reader.GetColumnSchema().Where(x => props.Any(p => p.Name.Equals(x.ColumnName, StringComparison.OrdinalIgnoreCase))).ToDictionary(key => key.ColumnName.ToLower());
while (reader.Read())
{
var item = Activator.CreateInstance<T>();
foreach (var prop in props)
{
var propValue = reader.GetValue(colMapping[prop.Name.ToLower()].ColumnOrdinal.Value);
prop.SetValue(item, propValue == DBNull.Value ? null : propValue);
}
result.Add(item);
}
}
return result;
}
//
///将数据从datareader映射到列表对象
///
私有列表映射列表(DbDataReader)
{
var result=新列表();
if(reader.HasRows)
{
var props=typeof(T).GetRuntimeProperties();
var colMapping=reader.GetColumnSchema().Where(x=>props.Any(p=>p.Name.Equals(x.ColumnName,StringComparison.OrdinalIgnoreCase)).ToDictionary(key=>key.ColumnName.ToLower());
while(reader.Read())
{
var item=Activator.CreateInstance();
foreach(道具中的var道具)
{
var propValue=reader.GetValue(colMapping[prop.Name.To