【问题标题】:Mapping entity in DapperDapper 中的映射实体
【发布时间】:2012-03-20 01:26:55
【问题描述】:

我刚刚开始使用 Dapper,但我似乎没有找到像将实体映射到数据库中的表这样简单的东西:

我有一个存储过程:

CREATE PROCEDURE [dbo].GetUserById (@UserId int)
AS  
begin               
        SELECT UserId,LastName,FirstName,EmailAddress
        FROM users
        WHERE UserID = @UserId

end
go

然后是一个实体:

public class User
{
    public int Id { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string Email { get; set; }
}

我的代码中有一个简洁的查询:

int userid=1;
    User User = connection.Query<User>("#GetUserById", new {userid=userid}, commandType: CommandType.StoredProcedure).FirstOrDefault();

我的问题是:如何告诉我的实体用户 Id 是我数据库上的用户 ID?

在 EF 中我会这样做:

MapSingleType(c => new
            {
                UserId = c.Id,
                Firstname = c.Firstname,
                Lastname = c.Lastname,
                EmailAddress = c.Email
            }).ToTable("users");

如何在dapper中实现以上功能?

【问题讨论】:

    标签: c# .net orm mapping dapper


    【解决方案1】:

    我会向您推荐 NReco。它像 dapper 一样高性能,但具有简单的属性映射。 nreco

    【讨论】:

      【解决方案2】:

      你可以试试这样的:

      public class User
      {
          public int Id { get; set; }
          public string LastName { get; set; }
          public string FirstName { get; set; }
          public string Email { get; set; }
      
          #region Remappings
      
          public int UserId
          {
              get { return Id; }
              set { Id = value; }
          }
      
          #endregion
      }
      

      对于您的示例而言,这可能有点过头了,但我发现它在某些情况下很有用,可以避免每次 Query 调用都与重映射代码混淆。

      【讨论】:

      • 宁愿在 Query 代码中处理此映射,也不愿将我的对象弄乱并将它们绑定到数据层
      【解决方案3】:

      Dapper 故意没有映射层;这是可以工作的绝对最小值,坦率地说,它涵盖了该过程中的大多数真实场景。但是,如果我正确理解您不想在 TSQL 中使用别名,并且不想要任何直通属性 - 然后使用非通用 Query API:

      User user = connection.Query("...", ...).Select(obj => new User {
                 Id = (int) obj.UserId,
                 FirstName = (string) obj.FirstName,
                 LastName = (string) obj.LastName,
                 Email = (string) obj.EmailAddress
              }).FirstOrDefault();
      

      或者在单个记录的情况下更简单:

      var obj = connection.Query("...", ...).FirstOrDefault();
      User user = new User {
            Id = (int) obj.UserId,
            FirstName = (string) obj.FirstName,
            LastName = (string) obj.LastName,
            Email = (string) obj.EmailAddress
      };
      

      这里的技巧是非泛型Query(...) API 使用dynamic,为每个列名提供成员。

      【讨论】:

      • @david 不是实质性的,可能慢了 2%
      【解决方案4】:

      不能,您的用户类必须定义为与查询返回的结果相匹配。

      获得结果后,您必须手动将其映射到另一个类(或使用 AutoMapper)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多