Asp.net mvc EntityFrameworkCore FromSql方法调用引发System.NotSupportedException

Asp.net mvc EntityFrameworkCore FromSql方法调用引发System.NotSupportedException,asp.net-mvc,entity-framework,entity-framework-core,Asp.net Mvc,Entity Framework,Entity Framework Core,因此,我将aspnetcore1.0与efcore1.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

因此,我将aspnetcore1.0与efcore1.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对象”。这是否只包含查询结果,在本例中,要删除的特定列对象?

FromSql旨在允许您编写一个将返回实体的自定义sqlselect语句。在这里,将其与DELETE语句一起使用是不合适的,因为您的目标是加载要删除的记录,然后使用默认的实体框架机制删除它们。Delete语句通常不会返回已删除的记录,尽管有一些方法可以实现这一点。即使他们这样做了,记录也将被删除,因此您不希望对其进行迭代并对其进行删除

最简单的方法是将RemoveRange方法与Where查询结合使用

或者,如果要加载实体并手动遍历它们以

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语句,请使用类似于以下内容的EXECUTESQLCOMAND方法:

public void DeleteColumn(int p_ColumnID)
{
    string sqlStatement = "DELETE FROM Columns WHERE ID = {0}";
    m_context.Database.ExecuteSqlCommand(sqlStatement, p_ColumnID);
}
FromSql允许您编写一个自定义的SQL SELECT语句,该语句将返回实体。在这里,将其与DELETE语句一起使用是不合适的,因为您的目标是加载要删除的记录,然后使用默认的实体框架机制删除它们。Delete语句通常不会返回已删除的记录,尽管有一些方法可以实现这一点。即使他们这样做了,记录也将被删除,因此您不希望对其进行迭代并对其进行删除

最简单的方法是将RemoveRange方法与Where查询结合使用

或者,如果要加载实体并手动遍历它们以

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语句,请使用类似于以下内容的EXECUTESQLCOMAND方法:

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

在我没有使用delete语句的情况下,我也有同样的例外。原来我在使用内存数据库。因为它不是一个真正的数据库,所以不能使用FromSQL。

在我没有使用delete语句的情况下,我也有同样的例外。原来我在使用内存数据库。因为它不是一个真正的数据库,所以不能使用FromSQL。

不确定您在这里要做什么。DELETE语句不会返回已删除的行,FromSql需要返回与您的实体类型匹配的列请参见.@stephen.vakil我编辑了原始的quiestion,希望能让它更清楚。基本上,我正在尝试从数据库中删除具有特定ID的列。我希望FromSql方法返回具有特定ID的正确列,并将其删除到columnsList变量中。在此之后,我遍历列表并在保存之前将其从数据库集中删除。我已经多次查看该文档未提及的内容,并且没有从中得到任何帮助来解决此问题。为什么我的DELETE语句不返回行?我怎么也不返回列实体类型呢?我可能应该说这是我第一次使用C与SQL/LINQ交互。Delete是一个语句,而不是一个查询。通常,它只返回受影响行的数量。你真正的代码比这复杂吗?您不需要使用原始sql来完成代码示例。您可以按说明使用RemoveRange。。。m_context.Columns.RemoveRangem_context.Columns.Wherex=>x.ID==p_ColumnID或将前两行替换为var columnList=m_context.Columns.Wherex=>x.ID==p_ColumnIDSo是SELECT,WHERE语句是否也大于?如果是SELECT查询,我会遇到同样的问题吗?我不知道您提供的解决方案,因为我对C LINQ还是新手。解决方案更容易。然而,为了我的利益,我希望更好地理解为什么它不起作用,以及如何使用原始sql使它起作用,以提高我的技能。如果您熟悉EFCore,如果您能解释一下FromSql的功能,我将不胜感激?比如,如果它只是返回行数,而实际上对数据库没有任何作用,那么我该怎么做才能使用原始SQL解决这个问题?不知道您在这里想做什么。DELETE语句不会返回已删除的行,FromSql需要返回与实体类型匹配的列请参见.@stephen.vakil我已编辑了原始的quiestion,希望能让它更清楚。基本上,我正在尝试从数据库中删除一个具有特定ID的列。我希望FromSql方法返回具有
要删除到columnsList变量中的特定ID。在此之后,我遍历列表并在保存之前将其从数据库集中删除。我已经多次查看该文档未提及的内容,并且没有从中得到任何帮助来解决此问题。为什么我的DELETE语句不返回行?我怎么也不返回列实体类型呢?我可能应该说这是我第一次使用C与SQL/LINQ交互。Delete是一个语句,而不是一个查询。通常,它只返回受影响行的数量。你真正的代码比这复杂吗?您不需要使用原始sql来完成代码示例。您可以按说明使用RemoveRange。。。m_context.Columns.RemoveRangem_context.Columns.Wherex=>x.ID==p_ColumnID或将前两行替换为var columnList=m_context.Columns.Wherex=>x.ID==p_ColumnIDSo是SELECT,WHERE语句是否也大于?如果是SELECT查询,我会遇到同样的问题吗?我不知道您提供的解决方案,因为我对C LINQ还是新手。解决方案更容易。然而,为了我的利益,我希望更好地理解为什么它不起作用,以及如何使用原始sql使它起作用,以提高我的技能。如果您熟悉EFCore,如果您能解释一下FromSql的功能,我将不胜感激?比如,如果它只返回行数,而实际上对数据库没有任何作用,那么我该怎么做才能使用原始SQL解决这个问题呢?所以我想从数据库中选择一列并更改它的属性,例如它的名称。我在列DbSet上使用了“Where”方法来检索ID为的正确列。这通常是通过“SELECT”SQL查询完成的。这可能是错误的假设,但是“Where”方法真的很强大并且可以用于大多数DB操作吗?这不对吗?我还注意到它在DbSet上有一个“Select”方法,它到底做了什么,因为我不知道它接受什么参数或返回什么?我还想知道,我的Columns表是否包含很多列行。所以需要一个大数据集。与在FromSql或ExecuteSqlCommand上执行常规Sql命令相比,使用“Where”进行过滤是否较慢?EF文档使用FromSql和Select查询,然后使用LINQ方法构建/组合查询。我真的在努力理解解决大多数问题的最佳方案,所以我想从数据库中选择一列并更改它的属性,例如它的名称。我在列DbSet上使用了“Where”方法来检索ID为的正确列。这通常是通过“SELECT”SQL查询完成的。这可能是错误的假设,但是“Where”方法真的很强大并且可以用于大多数DB操作吗?这不对吗?我还注意到它在DbSet上有一个“Select”方法,它到底做了什么,因为我不知道它接受什么参数或返回什么?我还想知道,我的Columns表是否包含很多列行。所以需要一个大数据集。与在FromSql或ExecuteSqlCommand上执行常规Sql命令相比,使用“Where”进行过滤是否较慢?EF文档使用FromSql和Select查询,然后使用LINQ方法构建/组合查询。我真的在努力了解大多数问题的最佳解决方案。