【问题标题】:Can Dapper be used to update and insert models?Dapper 可以用来更新和插入模型吗?
【发布时间】:2016-03-24 13:34:06
【问题描述】:

我一直在使用 Dapper,试图看看它是否是 Entity Framework 的一个很好的轻量级替代品。到目前为止,我对它能够快速从数据库中提取实体<model> 并将其放入模型的 IEnumerable 或仅创建模型的单个实例的能力印象深刻。非常光滑。

但我没有看到将模型更新回数据库的简单方法。

例子:

public class Dog
{
    public Guid Id { get; set; }
    public int? Age { get; set; }
    public string Name { get; set; }
    public float? Weight { get; set; }
} 

我们可以很容易地创建一个 Dog 的 IEnumerable,如下所示:

IEnumerable<Dog> dogs = connection.Query<Dog>("SELECT * FROM Dog")

或者,对于单个实例:

Dog dog = connection.Query<Dog>("SELECT * FROM Dog WHERE DogId = @dogid")

这一切都很好。但是现在,如果我们对“狗”进行更改(例如,只是更改它的重量),是否有一种巧妙、快速、简单的方法可以将该实体返回到数据库中,而无需执行手动 UPDATE 查询,列出每个字段?

谢谢!

【问题讨论】:

  • 看来传递List&lt;T&gt;应该insert multiple items?顺便说一句,坚持参数化查询 (SELECT * FROM Dog WHERE DogId = @DogId),除非你喜欢 sql 注入攻击。
  • 该语法如何工作?在查看 GitHub 上的自述文件时,我没有看到这样的示例。 github.com/StackExchange/dapper-dot-net
  • 大概像我链接到的答案:connection.Execute(@"update Dog set Name=@Name, Age=@Age", list);?
  • 啊抱歉,我完全错过了您评论中的链接
  • 是的,您对参数化查询是正确的。在我的例子中我很懒

标签: c# sql .net dapper


【解决方案1】:

您可以使用Dapper.Contrib.Extensions 中的SqlMapperExtensions 类:

using Dapper;
using Dapper.Contrib.Extensions;

// don't forget the using since Update is an extension method

Dog entity; // you got it from somewhere
entity.Name = "fancy new dog name";
connection.Update(entity);

为了使它工作,您需要将 [Key] 注释添加到您的 id。 应该看起来像这样:

using System.ComponentModel.DataAnnotations;

public class Dog
{
    [Key]
    public long Id { get; set; }
    public int? Age { get; set; }
    public string Name { get; set; }
    public float? Weight { get; set; }
} 

【讨论】:

  • 好的!这比我所希望的要多得多。我需要一段时间才能对此进行测试,但在我完成测试之后,当我得到它的工作时,我会将其标记为答案。
【解决方案2】:

Dapper 是一种 Micro - Orm,具有简单快速的特点。您描述的行为与完全成熟的 ORM 更相关,这意味着有一些会话概念、映射和查询生成(希望有不同 SQL 风格的驱动程序)。这绝对不是 Dapper 的精神,无论如何让更新/插入的过程比普通的 ado.net 更容易,接受 POCO 对象作为查询的参数,即:

.Execute("update mydogs  set age=@Age where id=@Id",dog);

【讨论】:

  • 好的,这是有道理的。几个问题。 (at)Age 和 (at)Id 是如何填充的?它们是否在查询末尾自动填充“,狗”? (我无法在此评论中使用 AT 符号或堆栈溢出认为我正在尝试通知用户)
  • 是的,参数是通过从“狗”实例属性值中获取的,并具有相应的名称
猜你喜欢
  • 2011-08-22
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
相关资源
最近更新 更多