Sto utilizzando AspNetCore 1.0 con EFCore 1.0, entrambe le versioni più recenti per quanto ne so.
L'esecuzione di una query per eliminare un oggetto utilizzando il metodo FromSql su un DbSet genera un'eccezione. Sia il codice che l'eccezione sono sotto.
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();
}
Dopo aver eseguito la chiamata FromSql, ottengo la seguente eccezione
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.
Non ho idea di come correggere questo errore e da Google non ho riscontrato problemi analoghi.
Mi sto anche chiedendo, se la query / codice fosse riuscita a restituire un oggetto IQueryable. Questo contiene solo i risultati della query, in questo caso l'oggetto Column specifico da eliminare?
FromSql
scopo di consentire la composizione di un'istruzione SQL SELECT
personalizzata che restituirà le entità. L'utilizzo con un'istruzione DELETE
non è appropriato in questo caso, poiché l'obiettivo è caricare i record che si desidera eliminare e quindi eliminarli utilizzando il meccanismo Entity Framework predefinito. Un'istruzione Delete
generalmente non restituisce i record cancellati (sebbene ci siano modi per farlo). Anche se lo facessero, i record saranno già cancellati e quindi non vorrai iterare su di loro e fare una Remove
su di essi.
Il modo più semplice per fare ciò che vuoi è utilizzare il metodo RemoveRange
in combinazione con una query Where
.
public void DeleteColumn(int p_ColumnID)
{
m_context.Columns.RemoveRange(m_context.Columns.Where(x => x.ID == p_ColumnID))
m_context.SaveChanges();
}
In alternativa, se vuoi caricare le tue entità e iterarle manualmente attraverso
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();
}
Se si desidera eseguire manualmente l'istruzione Delete
, come suggerito da Mike Brind , utilizzare un metodo ExecuteSqlCommand
simile a:
public void DeleteColumn(int p_ColumnID)
{
string sqlStatement = "DELETE FROM Columns WHERE ID = {0}";
m_context.Database.ExecuteSqlCommand(sqlStatement, p_ColumnID);
}
Ho avuto la stessa eccezione in un caso in cui non ho usato la dichiarazione di eliminazione. Risulta che stavo usando il database in memoria . Dal momento che non è un vero database non è possibile utilizzare FromSQL
.