2016-09-07 63 views
0

所以我使用AspNetCore 1.0與EFCore 1.0,兩個最新版本據我所知。EntityFrameworkCore FromSql方法調用拋出System.NotSupportedException

使用DbSet上的FromSql方法執行查詢以刪除對象會引發異常。代碼和例外如下。

public void DeleteColumn(int p_ColumnID) 
{ 
    int temp = p_ColumnID; 
    string query = "DELETE FROM Columns WHERE ID = {0}"; 
    var columnsList = m_context.Columns.FromSql(query, p_ColumnID).ToList(); 
    foreach (Columns c in columnsList) 
    { 
     m_context.Columns.Remove(c); 
    } 
    m_context.SaveChanges(); 
} 

執行FromSql電話後,我得到下面的異常

An exception of type 'System.NotSupportedException' occurred in Remotion.Linq.dll but was not handled in user code 

Additional information: Could not parse expression 'value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[ASPNET5_Scrum_Tool.Models.Columns]).FromSql("DELETE FROM Columns WHERE ID = {0}", __p_0)': This overload of the method 'Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSql' is currently not supported. 

我不知道如何解決這個錯誤,並從谷歌上搜索我所遇到沒有類似的問題。

我也想知道,如果查詢/代碼是成功的,它會返回一個'IQueryable對象。是否僅包含查詢的結果,在這種情況下是否要刪除特定的Column對象?

+0

不知道你在這裏試圖做什麼。您的DELETE語句不會返回已刪除的行,並且'FromSql'需要返回與您的實體類型匹配的列(請參見[here](https://docs.efproject.net/en/latest/querying/raw-sql)的.html#限制))。 –

+0

@ stephen.vakil我編輯了原始的quiestion,希望能夠讓它更清晰。基本上,我試圖用specfic ID從數據庫中刪除一列。我期望FromSql方法返回帶有特定標識的正確列以刪除到columnsList變量中。之後,我遍歷列表並在保存之前從DbSet中刪除它。 – Foysal94

+0

我已經多次閱讀過該文檔,我沒有從中獲得任何幫助來解決此問題。爲什麼我的DELETE語句不能返回行?而我又怎麼不返回一個Columns實體類型呢?我可能應該說這是我第一次使用C#與SQL/LINQ進行交互。 – Foysal94

回答

3

FromSql旨在讓您編寫將返回實體的自定義SQL SELECT語句。因爲您的目標是加載要刪除的記錄,然後使用默認的實體框架機制刪除它們,所以在此使用它與DELETE語句不合適。一個Delete聲明通常不會返回刪除的記錄(儘管有辦法實現這一點)。即使他們這樣做了,記錄也會被刪除,所以你不想迭代他們,並對他們做一個Remove

做你想做的事最直接的方法可能是使用RemoveRange方法和Where查詢。

public void DeleteColumn(int p_ColumnID) 
{ 
    m_context.Columns.RemoveRange(m_context.Columns.Where(x => x.ID == p_ColumnID))  
    m_context.SaveChanges(); 
} 

另外,如果要加載的實體,並通過手動進行迭代,以

public void DeleteColumn(int p_ColumnID) 
{ 
    columnList = m_context.Columns.Where(x => x.ID == p_ColumnID); 
    foreach (Columns c in columnsList) 
    { 
     m_context.Columns.Remove(c); 
    } 
    m_context.SaveChanges(); 
} 

如果你真的想手動發出Delete聲明,由Mike Brind的建議,使用類似的ExecuteSqlCommand方法到:

public void DeleteColumn(int p_ColumnID) 
{ 
    string sqlStatement = "DELETE FROM Columns WHERE ID = {0}"; 
    m_context.Database.ExecuteSqlCommand(sqlStatement, p_ColumnID); 
} 
+0

所以我想從數據庫中選擇一個列並更改它的一個屬性,例如它的名字。我使用Columns DbSet上的'Where'方法來檢索帶有ID的正確列。這通常會通過'SELECT'SQL查詢完成。這可能是錯誤的假設,但'Where'方法是否真的很強大,可以用於大多數數據庫操作?那是錯的嗎?我也注意到它在DbSet上有一個'Select'方法,這是做什麼的,因爲我不明白它接受什麼參數或返回什麼? – Foysal94

+0

另外我想知道,如果我的列表包含大量的行列。所以一個大的數據集。與在FromSql或ExecuteSqlCommand上執行常規Sql命令相比,這種過濾使用'Where'慢嗎? EF文檔通過Select查詢使用FromSql,並使用LINQ方法構建/組合。我真的很想了解大多數問題的最佳解決方案。 – Foysal94

相關問題