' System.Data.Entity.Core.EntityCommandExecutionException'发生在EntityFramework.SqlServer.dll中但未在用户代码

时间:2017-09-25 10:09:19

标签: asp.net-mvc datareader ef-database-first rawsql

我在下面做了原始SQL查询,只从表中选择某些字段。

{
 List<CustEmpVM> CustomerVMlist = new List<CustEmpVM>();
 var cid = db.Customers.SqlQuery("select SchedDate from Customer where CustID = '@id'").ToList<Customer>();
}

但我一直得到以下错误: {em> EntityFramework.SqlServer.dll 中发生了System.Data.Entity.Core.EntityCommandExecutionException,但未在用户代码中处理

  

其他信息:数据阅读器与指定的ALFHomeMovers.Customer不兼容。类型成员CustID在数据读取器中没有相应的列具有相同的名称。

2 个答案:

答案 0 :(得分:0)

使用以下查询而不是原始查询:

{
 List<CustEmpVM> CustomerVMlist = new List<CustEmpVM>();
 var cid = db.Customers.Where(w=>w.Id == YOURCUSTOMERID).Select(s=>new Customer{SchedDate = s.SchedDate }).ToList();
}

它将给出编译时错误而不是运行时错误。

答案 1 :(得分:0)

异常消息非常简单:查询期望返回Customer表的完整实体但仅返回SchedDate列,因此EF无法映射其他省略的列,包括CustID。< / p>

假设CustomersDbSet<Customer>,请尝试返回Customer中的所有字段:

// don't forget to include SqlParameter
var cid = db.Customers.SqlQuery("SELECT * FROM Customer WHERE CustID = @id", 
                                new SqlParameter("id", "[customer_id]")).ToList();

如果您只想返回SchedDate列,请具体化查询结果并在之后使用Select

var cid = db.Customers.SqlQuery("SELECT * FROM Customer WHERE CustID = @id", 
                                new SqlParameter("id", "[customer_id]"))
                      .AsEnumerable().Select(x => x.SchedDate).ToList();

注意:我认为您可以根据上面的SELECT查询构建LINQ:

var cid = (from c in db.Customers
           where c.CustID == "[customer_id]"
           select c.SchedDate).ToList();

类似问题:

The data reader is incompatible with the specified Entity Framework