【问题标题】:Entity Framework 7 Stored Procedure Result to ModelEntity Framework 7 存储过程结果模型
【发布时间】:2016-08-21 10:35:51
【问题描述】:

我有一个通过 EF7 映射到数据库的模型。所有属性都与表的映射列相同。

现在我有一个存储过程,它返回一些连接列,但基础仍然是映射模型。

这是我的模型(实体),它映射到我数据库上的 Table1。

public partial class Table1 { public int id { get; set; } public bool Column1{ get; set; } public int Column2 { get; set; } public int Column3 { get; set; } public int Column4 { get; set; } public int Column5 { get; set; } }

My StoredProcedure 返回所有这些列以及另一个表中的一个 Column,其中包含有关此对象的其他信息。

所以我的 StoredProcedure 看起来像这样:

CREATE PROCEDURE Table1_Select
    AS
        BEGIN
            SELECT  Column1,
                    Column2,
                    Column3,
                    Column4,
                    Column5,
                    Table2.JoinedColumn1
            FROM    Table1
            JOIN    Table2 on Table1.ID = Table2.ID_Table1
        END

我的想法是在模型中添加一个属性

public string JoinedColumn1 {get; set;}

这适用于执行 StoredProcedure,但一旦我想使用

获取一个实体,它就无法正常工作
MyContext.Table1.FirstOrDefault(t=>t.id == 1)

这总是在 Fiddler 中返回服务器错误 500,而使用 "Table1.FromSql("Table1Select")" 的存储过程执行工作正常。

或者我是否必须决定是对我的模型使用 StoredProcedures 还是直接访问实体?

对此有任何最佳实践或解决方案吗?

提前非常感谢。 尼康

【问题讨论】:

  • 为什么使用Entity Framework Database First方法的项目中不包含Store程序?
  • 如何在 Scaffold 命令中添加 StoredProcedures?我只发现this link 表示 -t 表示表或 -s 表示模式 ...

标签: c# sql-server stored-procedures entity-framework-core entities


【解决方案1】:

问题不在于我无法从存储过程中获取数据。 问题是由于存储过程,我的模型比数据库表中的列具有更多的属性。 但是,有时我仍然想直接访问模型实体,而不使用无法正常工作的存储过程,因为调试器对不在表中但在存储过程中的列说“无效列”。

希望它更清楚。

再次提前感谢。

尼康

【讨论】:

    【解决方案2】:

    试试这个方法

    var results = db.Database.SqlQuery<YourModel>("exec YourSPName [Optional Parameters]").ToList();
    

    【讨论】:

    • 当我将加入的列添加为属性时,return context.Table1.FromSql 工作正常,但是 context.Table1.ToList() 不再工作。
    • 型号:public partial class Table1 { public int id { get; set; } public bool Column1{ get; set; } public int Column2 { get; set; } public int Column3 { get; set; } public int Column4 { get; set; } public int Column5 { get; set; } public string JoinedColumn1 { get; set; } } 工作命令:StringBuilder sql = new StringBuilder(); sql.Append("EXEC Table1_Select"); return Table1.FromSql(sql.ToString()).ToList(); 不工作命令:return context.Table1.ToList(); 或者您需要文件吗?
    • 提供文件会好很多。
    • 你可以在这里找到我的测试项目:filedropper.com/testproject_1。这是一个很小的 ​​WebAPI,如果您需要使用数据对其进行测试,您可能必须包含您的 sql-server 并创建数据库。您可以在 zip 文件的根文件夹中找到 SP-Creation 脚本。
    • @nicn 请查看我的最新答案。
    【解决方案3】:

    我从源中阅读作为使用 ADO.NET 连接示例的解决方案。

    参数示例

    try
    {
                SqlDataAdapter adapt = new SqlDataAdapter("Table1_Select", ConnectionString);
                adapt.SelectCommand.Parameters.AddWithValue("@yourparameters", param);
    
                adapt.SelectCommand.CommandType = CommandType.StoredProcedure;
                DataTable dt = new DataTable();
                adapt.Fill(dt);
                adapt.Dispose();
                adapt = null;
    
                return dt;
    }
    catch(Exception ex)
    {
    throw ex
    }
    

    不要参数示例;

    try
    {
        SqlDataAdapter adapt = new SqlDataAdapter("Table1_Select", ConnectionString);
        adapt.SelectCommand.CommandType = CommandType.StoredProcedure;
        DataTable dt = new DataTable();
        adapt.Fill(dt);
        adapt.Dispose();
        adapt = null;
    
        return dt;
    }
    catch (Exception ex)
    {
        throw ex;
    }
    

    您获取表列设置数据表并读取数据表值并设置您的类数据表值。

    读取数据表示例:

     DataTable dt = YourGetDataTableFunction(val);
      DataRow dr = dt.Rows[0]; //index is zero
    string Column1 = dr["column1"].ToString();
    string Column2 =dr["column2"].ToString();
    

    希望对你有帮助。

    其他问题:How to run stored procedures in Entity Framework Core?

    【讨论】:

      【解决方案4】:

      从您最近的帖子中,您说您使用的是相同的模型并出现错误,所以我建议您在声明之前使用 [NOTMAPPED] 实体可以说,

      public int Column5 { get; set; } 仅在您调用您的 SP 时使用,因此请这样写,

      [NotMapped]
      public int Column5 { get; set; }
      

      【讨论】:

      • 这适用于实体,但.FromSql("exec SP_Name") 现在不返回此列。我是否必须使用 Akin 的方式来存储存储过程,然后才能获取该列的值?
      • 你试过了吗?它可能对你有用。 var results = db.Database.SqlQuery("exec YourSPName [Optional Parameters]").ToList();
      • 似乎在 7.0.0-rc1-final FromSql 已经替换了 SqlQuery 并且必须针对 DbSet。我们将在团队中看到我们将走哪条路,以及我们的项目中可能会出现哪些案例。非常感谢您为此付出的努力。
      • @nicn :我很高兴在这个主题上与您合作,正如您所说,您的团队将决定将要发生的事情和案例,所以我想请求您,如果您找到合适的解决方案而不是也在此页面上发布,以便其他人可以从您更新的答案中解决。谢谢
      猜你喜欢
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多