实体框架7存储过程结果到模型

时间:2016-04-27 08:40:07

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

我有一个通过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返回所有这些列,另外还有一个来自另一个表的列,其中包含有关此对象的其他信息。

所以我的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用于我的模型或直接访问实体?

任何最佳实践或解决方案?

非常感谢提前。 Nicn

4 个答案:

答案 0 :(得分:0)

试试这个,

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

答案 1 :(得分:0)

我从源代码中读取了一个使用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并读取dataTable值并设置类数据表值。

阅读DataTable示例:

 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?

答案 2 :(得分:0)

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

希望它更清楚。

提前再次感谢。

Nicn

答案 3 :(得分:0)

从你最近的帖子中,你说你正在使用相同的模型并收到错误,所以我想建议在你的perced声明之前使用[NOTMAPPED] 实体让我们说,

public int Column5 { get; set; } 仅在您呼叫SP时使用,所以写一下,

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