Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework ASP.NET核心实体框架SQL查询选择_Entity Framework_Stored Procedures_Asp.net Core_Data Access Layer - Fatal编程技术网

Entity framework ASP.NET核心实体框架SQL查询选择

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

我是众多努力从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.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
    }