.NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

简介:  写在前面 上篇文章我们讲了如在在实际项目开发中使用Git来进行代码的版本控制,当然介绍的都是比较常用的功能。今天我再带着大家一起熟悉下一个ORM框架Dapper,实例代码的演示编写完成后我会通过Git命令上传到GitHub上,正好大家可以再次熟悉下Git命令的使用,来巩固上篇文章的知识。



写在前面

上篇文章我们讲了如在在实际项目开发中使用Git来进行代码的版本控制,当然介绍的都是比较常用的功能。今天我再带着大家一起熟悉下一个ORM框架Dapper,实例代码的演示编写完成后我会通过Git命令上传到GitHub上,正好大家可以再次熟悉下Git命令的使用,来巩固上篇文章的知识。本篇文章已经收入.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划 有兴趣的朋友可以加入.NET Core项目实战交流群进行交流。

作者:依乐祝

原文地址:https://www.cnblogs.com/yilezhu/p/10024091.html

Dapper是什么

Dapper是.NET下一个轻量级的ORM框架,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的。也就是说实体类都要自己写。它没有复杂的配置文件,一个单文件就可以了。Dapper通过扩展你的IDbConnection来进行工作的。如果你想了解更多内容的话请点击这里

Dapper快速入门

前面几篇文章我们进行介绍的时候都是手动在代码里面创建的模拟数据,这篇文章我们就结合Dapper来从数据库进行相关的操作。为了演示的方便,这里的实例代码我们就使用一个简单地asp.net core控制台程序来进行。

开始前的准备

  1. 在我们的项目文件夹,单击鼠标右键选择“在当前文件夹下面打开Git Bash”
  2. 然后输入git checkout Master 切换回Mater分支,然后输入git checkout -b Sample05 创建一个新的名为“Sample05”的分支,如下所示:

1543242325029

  1. 使用vs2017创建一个新的项目,名称为“Sample05” 位置位于我们当前的目录,如下图所示:

1543242490572

  1. 接下来打开数据库,新建一个Content内容表,表结构还沿用之前教程中的实体,这里只给出MSSql的脚本:至于MySql的你自己建了,如果你实在不会的话可以到群里问其他小伙伴要吧

    CREATE TABLE [dbo].[content](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [title] [nvarchar](50) NOT NULL,
        [content] [nvarchar](max) NOT NULL,
        [status] [int] NOT NULL,
        [add_time] [datetime] NOT NULL,
        [modify_time] [datetime] NULL,
     CONSTRAINT [PK_Content] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[content] ADD  CONSTRAINT [DF_Content_status]  DEFAULT ((1)) FOR [status]
    GO
    
    ALTER TABLE [dbo].[content] ADD  CONSTRAINT [DF_content_add_time]  DEFAULT (getdate()) FOR [add_time]
    GO
    
    CREATE TABLE [dbo].[comment](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [content_id] [int] NOT NULL,
        [content] [nvarchar](512) NOT NULL,
        [add_time] [datetime] NOT NULL,
     CONSTRAINT [PK_comment] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[comment] ADD  CONSTRAINT [DF_comment_add_time]  DEFAULT (getdate()) FOR [add_time]
    GO
    
  2. 项目中新增数据库表对应的实体对象,代码如下:

        public class Content
        {
            /// <summary>
            /// 主键
            /// </summary>
            public int id { get; set; }
    
            /// <summary>
            /// 标题
            /// </summary>
            public string title { get; set; }
            /// <summary>
            /// 内容
            /// </summary>
            public string content { get; set; }
            /// <summary>
            /// 状态 1正常 0删除
            /// </summary>
            public int status { get; set; }
            /// <summary>
            /// 创建时间
            /// </summary>
            public DateTime add_time { get; set; } = DateTime.Now;
            /// <summary>
            /// 修改时间
            /// </summary>
            public DateTime? modify_time { get; set; }
        }
    public class Comment
        {
            /// <summary>
            /// 主键
            /// </summary>
            public int id { get; set; }
            /// <summary>
            /// 文章id
            /// </summary>
            public int content_id { get; set; }
            /// <summary>
            /// 评论内容
            /// </summary>
            public string content { get; set; }
            /// <summary>
            /// 添加时间
            /// </summary>
            public DateTime add_time { get; set; } = DateTime.Now;
        }
  3. 项目中添加Dapper的Nugets包,相信一路看教程过来的你一定知道怎么新增Nuget包吧,这里就不过多介绍了。

1543243792492

实战演示

  1. 插入操作:将一个对象插入到数据库中,代码如下:

     /// <summary>
     /// 测试插入单条数据
     /// </summary>
    static void test_insert()
     {
      var content = new Content
      {
          title = "标题1",
          content = "内容1",
    
      };
      using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
      {
          string sql_insert = @"INSERT INTO [Content]
          (title, [content], status, add_time, modify_time)
    VALUES   (@title,@content,@status,@add_time,@modify_time)";
          var result = conn.Execute(sql_insert, content);
          Console.WriteLine($"test_insert:插入了{result}条数据!");
      }
     }
  2. 一次批量插入多条数据,测试代码如下:

    /// <summary>
     /// 测试一次批量插入两条数据
     /// </summary>
    static void test_mult_insert()
     {
      List<Content> contents = new List<Content>() {
         new Content
      {
          title = "批量插入标题1",
          content = "批量插入内容1",
    
      },
         new Content
      {
          title = "批量插入标题2",
          content = "批量插入内容2",
    
      },
     };
    
      using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
      {
          string sql_insert = @"INSERT INTO [Content]
          (title, [content], status, add_time, modify_time)
    VALUES   (@title,@content,@status,@add_time,@modify_time)";
          var result = conn.Execute(sql_insert, contents);
          Console.WriteLine($"test_mult_insert:插入了{result}条数据!");
      }
     }
  3. 执行下代码查看到控制台输出如下的结果:

1543246862147

然后到数据库查看下表中的数据如下:

1543246898729

  1. 下面我们再分别测试下删除一条数据,与一次删除多条数据吧,代码如下:

     /// <summary>
    /// 测试删除单条数据
    /// </summary>
    static void test_del()
    {
     var content = new Content
     {
         id = 2,
    
     };
     using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
     {
         string sql_insert = @"DELETE FROM [Content]
    WHERE   (id = @id)";
         var result = conn.Execute(sql_insert, content);
         Console.WriteLine($"test_del:删除了{result}条数据!");
     }
    }
    
    /// <summary>
    /// 测试一次批量删除两条数据
    /// </summary>
    static void test_mult_del()
    {
     List<Content> contents = new List<Content>() {
        new Content
     {
         id=3,
    
     },
        new Content
     {
         id=4,
    
     },
    };
    
     using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
     {
         string sql_insert = @"DELETE FROM [Content]
    WHERE   (id = @id)";
         var result = conn.Execute(sql_insert, contents);
         Console.WriteLine($"test_mult_del:删除了{result}条数据!");
     }
    }

1543247418059

然后去数据库里查看,发现主键为2,3,4的数据都已经被删除了,如下图所示:

1543247491525

  1. 下面我们再测试下修改吧,也是分别测试一次只修改一条数据(主键为5),与一次批量修改多条数据(主键为6,7)

    /// <summary>
    /// 测试修改单条数据
    /// </summary>
    static void test_update()
    {
     var content = new Content
     {
         id = 5,
         title = "标题5",
         content = "内容5",
    
     };
     using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
     {
         string sql_insert = @"UPDATE  [Content]
    SET         title = @title, [content] = @content, modify_time = GETDATE()
    WHERE   (id = @id)";
         var result = conn.Execute(sql_insert, content);
         Console.WriteLine($"test_update:修改了{result}条数据!");
     }
    }
    
    /// <summary>
    /// 测试一次批量修改多条数据
    /// </summary>
    static void test_mult_update()
    {
     List<Content> contents = new List<Content>() {
        new Content
     {
         id=6,
         title = "批量修改标题6",
         content = "批量修改内容6",
    
     },
        new Content
     {
         id =7,
         title = "批量修改标题7",
         content = "批量修改内容7",
    
     },
    };
    
     using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
     {
         string sql_insert = @"UPDATE  [Content]
    SET         title = @title, [content] = @content, modify_time = GETDATE()
    WHERE   (id = @id)";
         var result = conn.Execute(sql_insert, contents);
         Console.WriteLine($"test_mult_update:修改了{result}条数据!");
     }
    }

现在我们执行下测试代码看下结果吧

1543248037237

再到数据库中查看下数据,上步骤5中最后一张图相比较

1543248094960

  1. 增删改都测试了,下面就开始测试查询吧,我们分别来测试下查询指定的数据以及一次查询多条数据来看下结果吧。还是先上代码,:

     /// <summary>
    /// 查询单条指定的数据
    /// </summary>
    static void test_select_one()
    {
     using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
     {
         string sql_insert = @"select * from [dbo].[content] where id=@id";
         var result = conn.QueryFirstOrDefault<Content>(sql_insert, new { id=5});
         Console.WriteLine($"test_select_one:查到的数据为:");
     }
    }
    
    /// <summary>
    /// 查询多条指定的数据
    /// </summary>
    static void test_select_list()
    {
     using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
     {
         string sql_insert = @"select * from [dbo].[content] where id in @ids";
         var result = conn.Query<Content>(sql_insert, new { ids=new int[] { 6,7} });
         Console.WriteLine($"test_select_one:查到的数据为:");
     }
    }

然后我们打上断点然后去看下结果吧!这里图片我没有截成功,所以就不贴了。

  1. 关联查询,Dapper的强大之处就在于其关联查询了!为了测试的方便,我们给主键为5的content添加两个comment中,这个插入的代码就不贴出来了,留给大家自行书写吧,如果不会的话可以加群问群里的其他小伙伴吧。这里需要新建一个类

    public class ContentWithCommnet
        {
            /// <summary>
            /// 主键
            /// </summary>
            public int id { get; set; }
    
            /// <summary>
            /// 标题
            /// </summary>
            public string title { get; set; }
            /// <summary>
            /// 内容
            /// </summary>
            public string content { get; set; }
            /// <summary>
            /// 状态 1正常 0删除
            /// </summary>
            public int status { get; set; }
            /// <summary>
            /// 创建时间
            /// </summary>
            public DateTime add_time { get; set; } = DateTime.Now;
            /// <summary>
            /// 修改时间
            /// </summary>
            public DateTime? modify_time { get; set; }
            /// <summary>
            /// 文章评论
            /// </summary>
            public IEnumerable<Comment> comments { get; set; }
        }

然后就是测试代码,运行的查询测试代码如下:查询id为5的文章,文章是包含评论列表的

代码如下:

static void test_select_content_with_comment()
        {
            using (var conn = new SqlConnection("Data Source=127.0.0.1;User ID=sa;Password=1;Initial Catalog=Czar.Cms;Pooling=true;Max Pool Size=100;"))
            {
                string sql_insert = @"select * from content where id=@id;
select * from comment where content_id=@id;";
                using (var result = conn.QueryMultiple(sql_insert, new { id = 5 }))
                {
                    var content = result.ReadFirstOrDefault<ContentWithComment>();
                    content.comments = result.Read<Comment>();
                    Console.WriteLine($"test_select_content_with_comment:内容5的评论数量{content.comments.Count()}");
                }

            }
        }

结果如下所示,调试的代码没法截图我也很无奈。

1543251360510

GitHub源码

GitHub的测试源码已经上传,https://github.com/yilezhu/Czar.Cms/tree/Sample05 放在Czar.Cms的Sample05分支上面。大家可以参考下,觉得有用的话记得star哦!

总结

本文给大家演示了Dapper的常用方法,不过都是通过同步的方式进行操作的,如果你想使用异步的话可以自行进行测试。文中的大部分内容都有截图,个别调试无法截图的大伙可以自行调试查看!相信通过本文的实例讲解,大伙应该能够使用dapper进行相应的开发!下一篇文章我们将进行vue的讲解!当然也只是进行很浅层次的讲解。因为我是一个后端,也是抱着学习的态度来进行vue的记录的!主要是以快速上为主。

目录
相关文章
|
2月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
24天前
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
|
2月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
3月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
3月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
106 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
44 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
68 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
53 0
|
4月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?