2016-11-04 82 views
5

我試圖移植一個ASP.NET 4.5應用程序到.NET核心,我有一個真正的問題,我似乎無法弄清楚。.NET核心實體框架存儲過程

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

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

我知道我可以使用直接使用SqlConnection執行存儲過程的正常方式,但我想知道實體框架是否有辦法做到這一點。

+0

也許這個回答有用嗎? http://stackoverflow.com/a/9987939/968301 –

+0

所以我只注意到DataTable和DataSet以及他們所有的朋友在.NET Core中都不被支持,因爲它們被認爲是遺留的。所以我必須改用DbReader。我在這個假設中糾正了嗎? – DKhanaf

+0

我認爲你可以這樣執行你的存儲過程:'dbContext.TableName.FromSql(「stored_proc」)'我不知道這是否會映射你的其他表中的所有字段。 –

回答

10

此刻,the way to execute stored procedures表示返回數據是使用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 
    } 
} 

plans to introduce support for returning ad hoc types從在某個階段SQL查詢。

+0

這就是我從所做的所有研究中得出的結論。解決我的問題的一種方法是引入一個DAO對象,該對象具有映射到存儲過程返回的所有字段的屬性。然後使用可能的隱式轉換將DAO轉換爲我的業務對象,並應用所有必要的邏輯來轉換字段等。 – DKhanaf

+0

剩餘的一個問題是存儲過程返回的多個數據集。只有這樣,我可以解決的辦法是將storedproc拆分爲兩個並分別調用它們,然後遵循上面的DAO模式,並在服務層將DAO合併到我的業務對象中。這可能是低效率,因爲我現在正在做兩個調用而不是一個調用,但以一種更清晰和更可讀的方式。 – DKhanaf

0

要回答@Dakhanaf的問題與多個數據集,您可以使用SqlDataAdapter填充所有結果集的DataSet對象。儘管SqlDataAdapter需要完整的.NET Framework,所以你必須運行.NETCore項目,同時瞄準.NET 462或類似的東西。

  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; 
       } 

      } 
     }