.NET核心實體框架存儲過程

asp.net-core c# entity-framework-core stored-procedures

我正在嘗試將ASP.NET 4.5應用程序移植到.NET Core,我有一個我似乎無法弄清楚的真正問題。

我現有的應用程序執行存儲過程,返回帶有多個數據表的數據集。實體框架可以自動將返回的字段映射到我的實體屬性,但僅適用於數據集中的第一個數據表(自然)。

所以我只想弄清楚它是否可能以某種方式攔截模型構建過程並使用自定義代碼來處理數據集並查看其他數據表來設置實體字段。

我知道我可以使用SqlConnection直接執行存儲過程的常規方法,但我想知道實體框架是否有某種方法可以執行此操作。

一般承認的答案

目前, 執行返回數據的存儲過程的方法是使用DbSet.FromSql方法。

using (var context = new SampleContext())
{
    var data= context.MyEntity
        .FromSql("EXEC GetData")
        .ToList();
}

這有一定的局限性:

  • 必須在DbSet上調用它
  • 返回的數據必須映射到DbSet類型的所有屬性
  • 它不支持ad hoc對象。

或者你可以回歸到普通的ADO.NET:

using (var context = new SampleContext())
using (var command = context.Database.GetDbConnection().CreateCommand())
{
    command.CommandText = "GetData";
    command.CommandType = CommandType.StoredProcedure;
    context.Database.OpenConnection();
    using (var result = command.ExecuteReader())
    {
        // do something with result
    }
}

計劃在某個階段引入對 SQL查詢返回ad hoc類型的支持


熱門答案

要回答@ DKhanaf對多個數據集的問題,可以使用SqlDataAdapter用所有結果集填充DataSet對象。但是,SqlDataAdapter需要完整的.NET Framework,因此您必須在針對.NET 462或類似的東西時運行.NETCore項目。

         using (var context = new SampleContext())
            using (var command = context.Database.GetDbConnection().CreateCommand())
            {
                command.CommandText = "GetData";
                command.CommandType = CommandType.StoredProcedure;
                context.Database.OpenConnection();
                using (SqlDataAdapter adapter = new SqlDataAdapter(command))
                {
                    var ds = new DataSet();
                    adapter.Fill(ds);
                    return ds;
                }

            }
        }


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因