0

我有一個通過EF7映射到數據庫的模型。所有屬性都與表格的映射列相同。實體框架7存儲過程結果到模型

現在我有一個存儲過程,它返回一些連接列,但基礎仍然是映射模型。

這是我的模型(實體),它被映射到我的數據庫上的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; } }

我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

+0

爲什麼包括使用實體框架數據庫優先方針項目,而不是存儲過程? –

+0

如何在Scaffold命令中添加StoredProcedures?我只發現[此鏈接](https://github.com/aspnet/EntityFramework/wiki/Design-Meeting-Notes-(2015年10月1日)#table-selection-in-reverse-engineering) t爲表或-s爲模式... – nicn

回答

0

嘗試這種方式,

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

當我將連接的列添加爲屬性時,return context.Table1.FromSql工作正常,但是'context.Table1.ToList()'不再工作。 – nicn

+0

你能提供代碼嗎? –

+0

Model:'public partial class Table1 { public int id {get;組; } public bool Column1 {get;組; } public int Column2 {get;組; } public int Column3 {get;組; } public int Column4 {get;組; } public int Column5 {get;組; } public string JoinedColumn1 {get;組; } }' 工作指令: 'StringBuilder sql = new StringBuilder(); sql.Append(「EXEC Table1_Select」); 返回Table1.FromSql(sql.ToString())ToList();' 不工作命令: '返回context.Table1.ToList();' 或者你需要的文件? – nicn

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 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?

0

的問題不在於我無法從StoredProcedure的獲取數據。 問題是,由於storedProcedure,我的模型具有比數據庫表中的列更多的屬性。 但是,我仍然希望直接訪問模型實體,而不使用存儲過程,因爲調試器對不在表中但存儲過程中列的「無效列」起作用。

希望它更清楚。

再次提前致謝。

Nicn

0

從你最近的文章中,你說你正在使用相同的模型和得到錯誤,所以我想表明,使用[NOTMAPPED]之前,您pertcular宣佈 實體可以說,

public int Column5 { get; set; } 它,而你在呼喚你的SP只能使用,因此寫這樣,

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

這是爲實體工作,但'.FromSql(「exec SP_Name」)'現在不返回此列。我是否必須使用Akin的方式來存儲過程,然後獲取此列的值? – nicn

+0

你有試過嗎?它可能適合你。 var results = db.Database.SqlQuery (「exec YourSPName [Optional Parameters]」)。ToList(); –

+0

似乎在7.0.0-rc1-final中FromSql已經替換了SqlQuery,並且必須針對DbSet。我們會在團隊中看到我們將走哪條路以及哪些案例可能出現在我們的項目中。非常感謝你在這方面的努力。 – nicn