Dapper没有填充字段和抛出异常

时间:2012-09-17 21:31:25

标签: asp.net-mvc-3 dapper

我正在从ActiveRecord切换到Dapper。我有一个简单的Project类,有几个字段:

  • Id(int)
  • 姓名(字符串)
  • 秘密(指导)
  • OwnerId(guid)

我最初尝试使用Dapper导致此代码: 我正在使用Dapper:

List<Project> projects = new List<Project>();
using (var conn = MvcApplication.GetSqlConnection()) // new connection
{
    projects = conn.Query<Project>("SELECT * FROM Projects p WHERE p.OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();
}
return View(projects);

此查询产生了DataException: Error parsing column 0 (Id=11 - Int16)。内部异常是InvalidCastException: Specified cast is not valid.

由于Dapper使用页面上的所有示例都没有提到SELECT *,我试图改变我的查询:

    projects = conn.Query<Project>("SELECT OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();

当我调试时,虽然我的数据库中有两个项目,但我只回来了一个;那个名字为null。

奇怪。我究竟做错了什么?我觉得Dapper没有正确地将字段(DB)映射到字段(类)。我正在使用最新的NuGet版本。

2 个答案:

答案 0 :(得分:1)

您看到的差异是下一个(1.12?)版本中的关键功能。从历史上看,dapper一直非常繁琐,数据必须是完全匹配,如果数据是双倍但字段/属性是浮点数,或者数据很长而字段/属性是int,它会抱怨(抛出) 。在待定版本中,有额外的代码来检测这一点,并将作为生成的IL 的一部分进行补偿(不是通过Convert.ChangeType - 太慢)。

此更改的一个关键驱动因素是某些数据库以非常不同的方式返回一些相当简单的值。某些数据库的用户通常会有问题来映射他们的类型。

Tl;博士:我很高兴新功能适合你。它应该很快就会发布。

答案 1 :(得分:0)

Dapper只会映射SQL的结果,因此您需要从表中选择要映射的表。

List<Project> projects = new List<Project>();
using (var conn = MvcApplication.GetSqlConnection()) // new connection
{
    projects = conn.Query<Project>("SELECT * FROM Projects Where OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();
}
return View(projects);

的Si