Entity framework ASP.NET核心实体框架SQL查询选择
我是众多努力从ASP.NET“升级”到ASP.NET核心的人之一 在ASP.NET项目中,我从DAL调用数据库,如下所示:Entity framework ASP.NET核心实体框架SQL查询选择,entity-framework,stored-procedures,asp.net-core,data-access-layer,Entity Framework,Stored Procedures,Asp.net Core,Data Access Layer,我是众多努力从ASP.NET“升级”到ASP.NET核心的人之一 在ASP.NET项目中,我从DAL调用数据库,如下所示: var result = context.Database.SqlQuery<Object_VM>("EXEC [sp_Object_GetByKey] @Key", new SqlParameter("@Key", Key)) .FirstOrDefault(); return result; 但这不起作用,因为context.Da
var result = context.Database.SqlQuery<Object_VM>("EXEC [sp_Object_GetByKey] @Key",
new SqlParameter("@Key", Key))
.FirstOrDefault();
return result;
但这不起作用,因为context.Database.ExecuteSQLCommand
仅用于更改数据库,而不是“选择”
我还将以下内容视为解决方案,但代码不会为我编译,因为“set”实际上是set
,并且此viewmodel没有数据库实体
var result = context.Set().FromSql("EXEC [sp_Object_getAll]");
非常感谢您的帮助。解决方案: (根据曾荫权的建议) 在GitHub上,有一个关于这个问题的讨论。一个用户建议处理这类请求,另一个用户添加了使其运行更顺畅的。我改变了方法,接受了稍微不同的参数 以下是我对其他也在寻找解决方案的人的改编(差别很小): DAL中的方法
public JsonResult GetObjectByID(int ID)
{
SqlParameter[] parms = new SqlParameter[] { new SqlParameter("@ID", ID) };
var result = RDFacadeExtensions.GetModelFromQuery<Object_List_VM>(context, "EXEC [sp_Object_GetList] @ID", parms);
return new JsonResult(result.ToList(), setting);
}
public JsonResult GetObjectByID(int-ID)
{
SqlParameter[]parms=newsqlparameter[]{newsqlparameter(“@ID”,ID)};
var result=rdfacadextensions.GetModelFromQuery(上下文,“EXEC[sp_Object_GetList]@ID”,parms);
返回新的JsonResult(result.ToList(),设置);
}
附加类
public static class RDFacadeExtensions
{
public static RelationalDataReader ExecuteSqlQuery(
this DatabaseFacade databaseFacade,
string sql,
SqlParameter[] parameters)
{
var concurrencyDetector = databaseFacade.GetService<IConcurrencyDetector>();
using (concurrencyDetector.EnterCriticalSection())
{
var rawSqlCommand = databaseFacade
.GetService<IRawSqlCommandBuilder>()
.Build(sql, parameters);
return rawSqlCommand
.RelationalCommand
.ExecuteReader(
databaseFacade.GetService<IRelationalConnection>(),
parameterValues: rawSqlCommand.ParameterValues);
}
}
public static IEnumerable<T> GetModelFromQuery<T>(
DbContext context,
string sql,
SqlParameter[] parameters)
where T : new()
{
DatabaseFacade databaseFacade = new DatabaseFacade(context);
using (DbDataReader dr = databaseFacade.ExecuteSqlQuery(sql, parameters).DbDataReader)
{
List<T> lst = new List<T>();
PropertyInfo[] props = typeof(T).GetProperties();
while (dr.Read())
{
T t = new T();
IEnumerable<string> actualNames = dr.GetColumnSchema().Select(o => o.ColumnName);
for (int i = 0; i < props.Length; ++i)
{
PropertyInfo pi = props[i];
if (!pi.CanWrite) continue;
System.ComponentModel.DataAnnotations.Schema.ColumnAttribute ca = pi.GetCustomAttribute(typeof(System.ComponentModel.DataAnnotations.Schema.ColumnAttribute)) as System.ComponentModel.DataAnnotations.Schema.ColumnAttribute;
string name = ca?.Name ?? pi.Name;
if (pi == null) continue;
if (!actualNames.Contains(name)) { continue; }
object value = dr[name];
Type pt = pi.DeclaringType;
bool nullable = pt.GetTypeInfo().IsGenericType && pt.GetGenericTypeDefinition() == typeof(Nullable<>);
if (value == DBNull.Value) { value = null; }
if (value == null && pt.GetTypeInfo().IsValueType && !nullable)
{ value = Activator.CreateInstance(pt); }
pi.SetValue(t, value);
}//for i
lst.Add(t);
}//while
return lst;
}//using dr
}
公共静态类RDFacadeExtensions
{
公共静态RelationalDataReader ExecuteSqlQuery(
此DatabaseFacade DatabaseFacade,
字符串sql,
SqlParameter[]参数)
{
var concurrencyDetector=databaseFacade.GetService();
使用(concurrencyDetector.EnterCriticalSection())
{
var rawSqlCommand=databaseFacade
.GetService()
.Build(sql、参数);
返回rawsql命令
.关系指挥部
.执行者(
databaseFacade.GetService(),
parameterValues:rawSqlCommand.parameterValues);
}
}
公共静态IEnumerable GetModelFromQuery(
DbContext上下文,
字符串sql,
SqlParameter[]参数)
其中T:new()
{
DatabaseFacade DatabaseFacade=新的DatabaseFacade(上下文);
使用(DbDataReader dr=databaseFacade.ExecuteSqlQuery(sql,参数).DbDataReader)
{
List lst=新列表();
PropertyInfo[]props=typeof(T).GetProperties();
while(dr.Read())
{
T=新的T();
IEnumerable actualNames=dr.GetColumnSchema().Select(o=>o.ColumnName);
对于(int i=0;i
1.您不需要从ASP.NET升级到ASP.NET Core,您应该将其视为一种升级。升级通常意味着向后兼容,迁移意味着不存在这种情况。因为ASP.NET Core是完全重写的,在幕后有着显著的差异。2.)ASP.NET Core没有删除任何内容,因为ASP.NET从来没有ORM.这是实体框架(重写为:EF Core)。3.阅读了解EF Core的局限性以及未来将添加哪些功能尚未实现的功能之一是即席绑定(将SQL绑定到未注册为实体的模型)很抱歉输入错误。Tseng-谢谢-帮助。不是重复的,因为另一个主题中的讨论是关于使用数据库中的模型,而我正试图避免这种情况。
public static class RDFacadeExtensions
{
public static RelationalDataReader ExecuteSqlQuery(
this DatabaseFacade databaseFacade,
string sql,
SqlParameter[] parameters)
{
var concurrencyDetector = databaseFacade.GetService<IConcurrencyDetector>();
using (concurrencyDetector.EnterCriticalSection())
{
var rawSqlCommand = databaseFacade
.GetService<IRawSqlCommandBuilder>()
.Build(sql, parameters);
return rawSqlCommand
.RelationalCommand
.ExecuteReader(
databaseFacade.GetService<IRelationalConnection>(),
parameterValues: rawSqlCommand.ParameterValues);
}
}
public static IEnumerable<T> GetModelFromQuery<T>(
DbContext context,
string sql,
SqlParameter[] parameters)
where T : new()
{
DatabaseFacade databaseFacade = new DatabaseFacade(context);
using (DbDataReader dr = databaseFacade.ExecuteSqlQuery(sql, parameters).DbDataReader)
{
List<T> lst = new List<T>();
PropertyInfo[] props = typeof(T).GetProperties();
while (dr.Read())
{
T t = new T();
IEnumerable<string> actualNames = dr.GetColumnSchema().Select(o => o.ColumnName);
for (int i = 0; i < props.Length; ++i)
{
PropertyInfo pi = props[i];
if (!pi.CanWrite) continue;
System.ComponentModel.DataAnnotations.Schema.ColumnAttribute ca = pi.GetCustomAttribute(typeof(System.ComponentModel.DataAnnotations.Schema.ColumnAttribute)) as System.ComponentModel.DataAnnotations.Schema.ColumnAttribute;
string name = ca?.Name ?? pi.Name;
if (pi == null) continue;
if (!actualNames.Contains(name)) { continue; }
object value = dr[name];
Type pt = pi.DeclaringType;
bool nullable = pt.GetTypeInfo().IsGenericType && pt.GetGenericTypeDefinition() == typeof(Nullable<>);
if (value == DBNull.Value) { value = null; }
if (value == null && pt.GetTypeInfo().IsValueType && !nullable)
{ value = Activator.CreateInstance(pt); }
pi.SetValue(t, value);
}//for i
lst.Add(t);
}//while
return lst;
}//using dr
}