Dapper能否用于更新和插入模型?

9
我一直在尝试使用Dapper来代替Entity Framework,从而找到一种轻量级的解决方案。到目前为止,我对它能够快速从数据库中获取一个实体<model>并将其转换为模型的可枚举集合,或者仅创建一个模型实例的能力感到印象深刻。非常棒。
但是,我没有找到一种简单的方法将该模型更新回数据库。
例如:
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查询并列出每个字段呢?

谢谢!


1
似乎传递一个 List<T> 应该插入多个项目?另外,坚持使用参数化查询(SELECT * FROM Dog WHERE DogId = @DogId),除非你喜欢 SQL 注入攻击。 - vgru
那个语法怎么用?在GitHub上查看ReadMe时,我没有看到那个的示例。https://github.com/StackExchange/dapper-dot-net - Casey Crookston
你是不是想要类似我提供的答案:connection.Execute(@"update Dog set Name=@Name, Age=@Age", list); - vgru
1
啊,抱歉,我完全错过了你评论中的链接。 - Casey Crookston
1
是的,你关于参数化查询是正确的。在我的示例中我有点懒了。 - Casey Crookston
2个回答

15
你可以使用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);

为了使此功能生效,您需要在id上添加[Key]注释。应该如下所示:
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; }
} 

1
好的!这正是我所期望的。在我测试并且使其工作后,我会将其标记为答案,但这可能需要一些时间。 - Casey Crookston

9

Dapper是一个微型ORM,具有简单和快速的特点。你描述的行为更多地与完整的ORM相关,这意味着需要一些会话概念、映射以及查询生成(希望能够支持不同的SQL风格驱动程序)。这绝对不是Dapper的精神所在,而Dapper使更新/插入过程比纯ADO.NET更容易,接受POCO对象作为您的查询参数,例如:

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

好的,这有点意义。我有几个问题。(at)Age和(at)Id是如何填充的?它们是否会自动填充查询末尾的", dog"?(我无法在此评论中使用AT符号,否则Stack Overflow会认为我正在尝试通知用户) - Casey Crookston
1
是的,参数是通过从“dog”实例属性值中获取相应名称来填充的。 - Felice Pollano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接