Also benutze ich AspNetCore 1.0 mit EFCore 1.0, die beiden neuesten Versionen, soweit mir bekannt ist.
Beim Ausführen einer Abfrage zum Löschen eines Objekts mit der FromSql-Methode für ein DbSet wird eine Ausnahme ausgelöst. Sowohl der Code als auch die Ausnahme sind unten aufgeführt.
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();
}
Nach dem Ausführen des FromSql-Aufrufs erhalte ich die folgende Ausnahme
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.
Ich habe keine Ahnung, wie ich diesen Fehler beheben kann und vom Googeln bin ich auf keine ähnlichen Probleme gestoßen.
Ich frage mich auch, ob die Abfrage / der Code erfolgreich war, würde ein 'IQueryable-Objekt zurückgeben. Würde das nur die Ergebnisse der Abfrage enthalten, in diesem Fall das spezifische zu löschende Spaltenobjekt?
FromSql
können Sie eine benutzerdefinierte SQL SELECT
Anweisung FromSql
, die Entitäten FromSql
. Die Verwendung mit einer DELETE
Anweisung ist hier nicht sinnvoll, da Sie die zu löschenden Datensätze laden und dann mit dem standardmäßigen Entity Framework-Mechanismus löschen möchten. Eine Delete
Anweisung gibt die gelöschten Datensätze im Allgemeinen nicht zurück (es gibt jedoch Möglichkeiten, dies zu erreichen). Selbst wenn dies der Fall ist, werden die Datensätze bereits gelöscht und Sie werden nicht mehr darüber iterieren und Remove
für sie durchführen.
Der einfachste Weg, um zu tun, was Sie wollen, könnte die Verwendung der RemoveRange
Methode in Kombination mit einer Where
Abfrage sein.
public void DeleteColumn(int p_ColumnID)
{
m_context.Columns.RemoveRange(m_context.Columns.Where(x => x.ID == p_ColumnID))
m_context.SaveChanges();
}
Alternativ können Sie Ihre Entitäten laden und sie manuell durchlaufen
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();
}
Wenn Sie die Delete
Anweisung, wie von Mike Brind vorgeschlagen , wirklich manuell ausgeben möchten, verwenden Sie eine ExecuteSqlCommand
Methode, die der folgenden ähnelt:
public void DeleteColumn(int p_ColumnID)
{
string sqlStatement = "DELETE FROM Columns WHERE ID = {0}";
m_context.Database.ExecuteSqlCommand(sqlStatement, p_ColumnID);
}