EntityFrameworkCore从FromSql方法调用抛出System.NotSupportedException

时间:2016-09-07 13:21:22

标签: asp.net-mvc entity-framework entity-framework-core

所以我正在使用AspNetCore 1.0和EFCore 1.0,据我所知,这两个版本都是最新版本。

在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对象吗?

2 个答案:

答案 0 :(得分: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();
}

如果您确实想按照Mike Brind的建议手动发出Delete语句,请使用类似于以下的ExecuteSqlCommand方法:

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

答案 1 :(得分:0)

在我不使用delete语句的情况下,我也有同样的例外。原来我正在使用内存数据库。由于它不是真实的数据库,因此您不能使用<% if (block = yield).empty? %> <h1>Goodbye world</h1> <% else %> <%= block %> <% end %>

相关问题