首页 > 数据库 >五、.Net Core Web Api连接MongoDB自动创建表格并实现CRUD功能

五、.Net Core Web Api连接MongoDB自动创建表格并实现CRUD功能

时间:2024-08-06 11:26:00浏览次数:15  
标签:Core 创建表格 string Web MongoDB await public using id

五、.Net Core Web Api连接MongoDB自动创建表格并实现CRUD功能
1.注册MongoDB账号,并获取Connection String;
MongoDB官网:MongoDB: The Developer Data Platform | MongoDB
获取Connection String教程:Connection String 获取

MongoDB ConnectionString

  1. 在VSCode for Mac按下shift+command+p搜索 Nuget Package Manager: Add Package,给项目添加包

    在这里插入图片描述

  2. 搜索包:MongoDB.Driver,Microsoft.EntityFrameworkCore,MongoDB.EntityFrameworkCore

    在这里插入图片描述

  3. MongoDB.Driver选择最新版本即可,如最新版本不适配您当前的.Net版本,请尝试根据MongoDB官网有关MongoDB.Driver的兼容性来进行安装:兼容性 - C#/.NET v2.28 (mongodb.com)

    Microsoft.EntityFrameworkCore和MongoDB.EntityFrameworkCore包选择8.x版本。
    在这里插入图片描述

  4. 在Web Api的appsetting.Development.json 添加MongoDB信息,在ConnectionString的值中填入在MongoDB官网获取的ConnectionString;

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "TeachingAppDatabase": {
        "BooksCollectionName": "books",
        "ConnectionString": "Fill it with your MongoDB connection string",
        "DatabaseName": "teaching_blazor_app"
      }
    }
    
    
  5. 创建Config/MongoDbConfiguration.cs,对应appsettings.Development.json中的参数。

    using System;
    namespace TeachingWebApi.Config
    {
    	public class TeachingAppDatabaseSettings
    	{
    		public string BooksCollectionName { get; init; }
    		public string ConnectionString { get; init; }
    		public string DatabaseName { get; init; }
    	}
    }
    
  6. 在Program.cs中加入以下服务,通过IConfiguration读取appsettings.Development.json中的参数。

    builder.Services.Configure<TeachingAppDatabaseSettings>(
    	builder.Configuration.GetSection("TeachingAppDatabase"));
    
  7. 创建BookService.cs添加 CRUD 操作服务.

    using Microsoft.Extensions.Options;
    using MongoDB.Driver;
    using TeachingWebApi.Config;
    using TeachingWebApi.Models;
    
    namespace TeachingWebApi.Services;
    
    public class BooksService
    {
        private readonly IMongoCollection<Book> _booksCollection;
    
        public BooksService(
            IOptions<TeachingAppDatabaseSettings> mongoDatabaseSettings)
        {
            var mongoClient = new MongoClient(
                mongoDatabaseSettings.Value.ConnectionString);
    
            var mongoDatabase = mongoClient.GetDatabase(
                mongoDatabaseSettings.Value.DatabaseName);
    
            _booksCollection = mongoDatabase.GetCollection<Book>(
                mongoDatabaseSettings.Value.BooksCollectionName);
        }
    
        public async Task<List<Book>> GetAsync() =>
            await _booksCollection.Find(_ => true).ToListAsync();
    
        public async Task<Book?> GetAsync(string id) =>
            await _booksCollection.Find(x => x.Id == id).FirstOrDefaultAsync();
    
        public async Task CreateAsync(Book newBook) =>
            await _booksCollection.InsertOneAsync(newBook);
    
        public async Task UpdateAsync(string id, Book updatedBook) =>
            await _booksCollection.ReplaceOneAsync(x => x.Id == id, updatedBook);
    
        public async Task RemoveAsync(string id) =>
            await _booksCollection.DeleteOneAsync(x => x.Id == id);
    }
    
  8. 新建一个BookController.cs,实现CRUD;

    using Microsoft.AspNetCore.Mvc;
    using TeachingWebApi.Models;
    using TeachingWebApi.Services;
    
    namespace BookStoreApi.Controllers;
    
    [ApiController]
    [Route("api/[controller]")]
    public class BooksController : ControllerBase
    {
        private readonly BooksService _booksService;
    
        public BooksController(BooksService booksService) =>
            _booksService = booksService;
    
        [HttpGet]
        public async Task<List<Book>> Get() =>
            await _booksService.GetAsync();
    
        [HttpGet("{id:length(24)}")]
        public async Task<ActionResult<Book>> Get(string id)
        {
            var book = await _booksService.GetAsync(id);
    
            if (book is null)
            {
                return NotFound();
            }
    
            return book;
        }
    
        [HttpPost]
        public async Task<IActionResult> Post(Book newBook)
        {
            await _booksService.CreateAsync(newBook);
    
            return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);
        }
    
        [HttpPut("{id:length(24)}")]
        public async Task<IActionResult> Update(string id, Book updatedBook)
        {
            var book = await _booksService.GetAsync(id);
    
            if (book is null)
            {
                return NotFound();
            }
    
            updatedBook.Id = book.Id;
    
            await _booksService.UpdateAsync(id, updatedBook);
    
            return NoContent();
        }
    
        [HttpDelete("{id:length(24)}")]
        public async Task<IActionResult> Delete(string id)
        {
            var book = await _booksService.GetAsync(id);
    
            if (book is null)
            {
                return NotFound();
            }
    
            await _booksService.RemoveAsync(id);
    
            return NoContent();
        }
    }
    
  9. 添加代码到Program.cs,以向 DI 注册 BooksService 类,以支持消费类中的构造函数注入。 单一实例服务生存期是最合适的,因为 BooksService 直接依赖于 MongoClient。 根据官方 Mongo Client 重用准则,应使用单一实例服务生存期在 DI 中注册 MongoClient

    builder.Services.AddSingleton<BooksService>();
    
  10. 新建类MongoDBContext.cs,负责连接MongoDB的上下文类;

    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Options;
    using MongoDB.Driver;
    using TeachingWebApi.Config;
    using TeachingWebApi.Models;
    
    namespace TeachingWebApi.Utils.Data
    {
        public class MongoDbContext : DbContext
        {
            public readonly IMongoDatabase _db;
            private readonly string _booksCollectionName;
            private readonly IOptions<TeachingAppDatabaseSettings> _setting;
    
            public MongoDbContext(IOptions<TeachingAppDatabaseSettings> setting)
            {
                _setting = setting;
                var client = new MongoClient(_setting.Value.ConnectionString);
                _db = client.GetDatabase(_setting.Value.DatabaseName);
                _booksCollectionName = _setting.Value.BooksCollectionName;
            }
    
            public IMongoCollection<Book> Books =>
            _db.GetCollection<Book>(_booksCollectionName);
    
        }
    }
    
  11. 添加类DatabaseSeeder.cs,负责初始化数据库;

    using Microsoft.Extensions.Localization;
    using Microsoft.AspNetCore.Identity;
    using MongoDB.Driver;
    using TeachingWebApi.Utils.Data;
    
    namespace CoolWebApi.Data.Seeder
    {
        public class DatabaseSeeder
        {
            private readonly MongoDbContext _dbContext;
    
            public DatabaseSeeder(
                MongoDbContext dbContext)
            {
                _dbContext = dbContext;
            }
    
            public void Initialize()
            {
                InitializeCollection();
            }
    
            public async void InitializeCollection()
            {
                await CreateCollection("books");
            }
    
            private async Task CreateCollection(string collectionName)
            {
                if (!CollectionExists(_dbContext._db, collectionName))
                {
                    await _dbContext._db.CreateCollectionAsync(collectionName, new CreateCollectionOptions
                    {
                        Capped = false
                    });
                    Console.WriteLine("Collection created!");
                }
            }
    
            private bool CollectionExists(IMongoDatabase database, string collectionName)
            {
                return database.ListCollectionNames().ToList().Contains(collectionName);
            }
        }
    }
    
  12. 在Program.cs添加数据库支持,使用Microsoft.EntityFrameworkCore和MongoDB.EntityFrameworkCore包,当项目运行时会执行DatabaseSeeder.cs和MongoDbContext.cs这两个类,实现初始化项目时生成数据库表;

    builder.Services
        .AddTransient<DatabaseSeeder>()
            .AddDbContext<MongoDbContext>(options => options
                .UseMongoDB(new MongoClient(MongoDbConectionString), "teaching_blazor_app"));
    
  13. 运行应用,记得将ConnectionString里的改成自己的密码,不然会报认证失败的错误;

    在这里插入图片描述

  14. 可以看到MongoDB的Collections已经自动生成了Books表,使用Swagger进行测试;
    在这里插入图片描述
    在这里插入图片描述

标签:Core,创建表格,string,Web,MongoDB,await,public,using,id
From: https://blog.csdn.net/Kevinxxxxx/article/details/140950617

相关文章

  • 面试题 .NET Core 开发工程师
    在面试.NETCore高级开发工程师时,通常会涉及多个方面的问题,以评估候选人在不同领域的深度和广度。以下是一些常见的面试题目分类及示例问题:###基础知识1.**.NETCore与.NETFramework的区别?**-请解释.NETCore和.NETFramework的主要区别,以及在什么情况下选择使用......
  • selenium webdriver出现Element is not currently visible and so may not be interac
    问题分析可能是没有加载完成,元素找不到。元素加载完成,但是元素需要点击按钮,才会触发元素插入进来元素加载完成,看到的值和实际后台传输的值是不一致的元素加载完成,本质是只有属性,是没有值的。看到的都是临时函数调用显示出来的解决方案针对第一种可以适当延长休眠时间来......
  • windows下RabbitMQ安装后,无法进入web管理页面问题
    在window安装rabbitmq,访问http://127.0.0.1:15672/,访问不了;有可能是没开启网页管理界面1、在cmd窗口下进入rabbitmq安装目录下的sbin目录,使用rabbitmq-plugins.batlist查看已安装的插件列表。 2、使用rabbitmq-plugins.batenablerabbitmq_management开启网页管理界面 ......
  • .netCore System.Drawing.Common 发布,在CentOS 运行报错
    centos下要运行 System.Drawing.Common,需要先安装mono的  libgdiplus插件才可以。安装后,还报以下错误的,才是下文的内容。 报错:System.PlatformNotSupportedException:System.Drawing.Commonisnotsupportedonnon-Windowsplatforms.Seehttps://aka.ms/systemdra......
  • EF Core性能优化技巧
    EFCore性能优化技巧 代码层面的优化1.使用实例池EFCore2.0为DbContext引入新的注册方式:透明地注册了DbContext实例池,使用这种方式可以避免始终创建新的实例,EFCore将重置其状态并将其存储在内部池中;当下次请求新的实例时,将返回该共用实例,而不是设置新的实例使用示例:......
  • vite和webpack的区别
    内核区别最明显区别是及时编译和打包编译,开发编译速度上的区别。配置区别主要区别就是webpack有loader和plugins配置,vite直接是plugins为主体。viteplugins中配置编译器和插件:其他json配置大同小异。参考文章https://zxuqian.cn/difference-between-vite-and-webpac......
  • web渗透—RCE
    一:代码执行相关函数1、eval()函数与assert()函数(1)原理:将用户提交或者传递的字符串当作php代码执行;最终造成命令执行漏洞(2)passby:单引号绕过:闭合+注释;开启GPC的话就无法绕过(GPC就是将单引号转换为"反斜杠+单引号")eg:<?phphighlight_file(__FILE__);//高亮显示代码......
  • Unity Gyro Camera ---- 传感器控制摄像头旋转 + 正北校准 (纯原生支持Android+IOS,无需
    UnityGyroCamera传感器控制摄像头旋转+正北校准纯原生支持Android+IOS,无需安装ARKit,ARCore等插件这篇文章主要介绍如何利用手机原生的传感器,控制摄像头的旋转,最终可以实现AR或者VR的摄像头旋转控制问题提出 虽然,目前有一些用手机传感器控制虚拟摄像头旋转的方案......
  • Bugku -----Web-----全题目解析 (二) 超详细步骤
    ————————————————————分割线———————————————————— 6.矛盾这一行从URL查询字符串中获取名为num的参数值,并将其赋值给$num变量。如果URL中没有提供num参数,或者参数值不是有效的字符串,则$num将被设置为空或者默认值。......
  • 免费为您的网页创建在线客服,扣子(COZE) WEB SDK图文使用教程
    ......