三剑客时 發表於 2023-4-11 01:10:00

.NET Core MongoDB数据仓储和工作单元模式实操

<h2>前言</h2>
<p>  上一章节我们主要讲解了MongoDB数据仓储和工作单元模式的封装,这一章节主要讲的是MongoDB用户管理相关操作实操。如:获取所有用户信息、获取用户分页数据、通过用户ID获取对应用户信息、添加用户信息、事务添加用户信息、用户信息修改、用户信息删除等实战教程。</p>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230407222549553-1063502695.png" alt="" loading="lazy"></p>
<h2>MongoDB从入门到实战的相关教程</h2>
<p>MongoDB从入门到实战之MongoDB简介👉</p>
<p>MongoDB从入门到实战之MongoDB快速入门👉</p>
<p>MongoDB从入门到实战之Docker快速安装MongoDB👉</p>
<p>MongoDB从入门到实战之MongoDB工作常用操作命令👉</p>
<p>MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(1)-后端项目框架搭建👉</p>
<p>MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(2)-Swagger框架集成👉</p>
<p>MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(3)-系统数据集合设计👉</p>
<p>MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(4)-MongoDB数据仓储和工作单元模式封装👉</p>
<p>MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(5)-MongoDB数据仓储和工作单元模式实操👉</p>
<h2>YyFlight.ToDoList项目源码地址</h2>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>欢迎各位看官老爷review,有帮助的别忘了给我个Star哦💖!!!</strong></span></p>
<blockquote>
<p>GitHub地址:https://github.com/YSGStudyHards/YyFlight.ToDoList</p>
<p>MongoRepository地址:https://github.com/YSGStudyHards/YyFlight.ToDoList/tree/main/Repository/Repository</p>
</blockquote>
<h2>MongoDB事务使用前提说明</h2>
<p>参阅MongoDB的事务👉</p>
<p><strong>说明:</strong></p>
<blockquote>
<p>MongoDB单机服务器不支持事务【使用MongoDB事务会报错:Standalone servers do not support transactions】,只有在集群情况下才支持事务,因为博主接下来都是在单机环境下操作,所以无法来演示Mongo事务操作,但是方法都已经是封装好了的,大家可以自己搭建集群实操。</p>
</blockquote>
<p><strong>原因:</strong></p>
<blockquote>
<p>MongoDB在使用分布式事务时需要进行多节点之间的协调和通信,而单机环境下无法实现这样的分布式协调和通信机制。但是,在MongoDB部署为一个集群(cluster)后,将多个计算机连接为一个整体,通过协调和通信机制实现了分布式事务的正常使用。从数据一致性和可靠性的角度来看,在分布式系统中实现事务处理是至关重要的。而在单机环境下不支持事务,只有在集群情况下才支持事务的设计方式是为了保证数据一致性和可靠性,并且也符合分布式系统的设计思想。</p>
</blockquote>
<h2>创建EntityBase公共类</h2>
<blockquote>
<p>一个公共的具有相同特性和行为的基类。</p>
</blockquote>
<div class="cnblogs_code">
<pre>    public class<span> EntityBase
    {
      /// &lt;summary&gt;
      /// 主键Id
      /// &lt;/summary&gt;
<span>      
      
      public string Id { get; set<span>; }

      /// &lt;summary&gt;
      /// 创建时间
      /// &lt;/summary&gt;
      public DateTime CreateDate { get; set<span>; }

      /// &lt;summary&gt;
      /// 更新时间
      /// &lt;/summary&gt;
      public DateTime UpdateDate { get; set<span>; }
    }</span></span></span></span></span></pre>
</div>
<h2>添加UserInfo用户表实体映射模型</h2>
<div class="cnblogs_code">
<pre>   
    public class<span> UserInfo : EntityBase
    {
      /// &lt;summary&gt;
      /// 登录账号
      /// &lt;/summary&gt;
      public string UserName { get; set<span>; }

      /// &lt;summary&gt;
      /// 登录密码
      /// &lt;/summary&gt;

      public string Password { get; set<span>; }

      /// &lt;summary&gt;
      /// 用户昵称
      /// &lt;/summary&gt;
      public string NickName { get; set<span>; }

      /// &lt;summary&gt;
      /// 用户头像
      /// &lt;/summary&gt;
      public string HeadPortrait { get; set<span>; }

      /// &lt;summary&gt;
      /// 用户邮箱
      /// &lt;/summary&gt;
      public string Email { get; set<span>; }

      /// &lt;summary&gt;
      /// 用户状态(0冻结,1正常,2注销)
      /// &lt;/summary&gt;
      public int Status { get; set<span>; }
    }</span></span></span></span></span></span></span></span></pre>
</div>
<p>在前面类中,Id属性中的特性的作用:</p>
<ul>
<li>需要用于将通用语言运行时(CLR)对象映射到MongoDB集合。</li>
<li>用进行注释,使该属性成为文档的主键。</li>
<li>用进行注释,以允许以字符串类型而不是ObjectId结构传递参数。Mongo处理从字符串到ObjectId的转换。没有此特性序列化时会有如下异常提示:</li>
</ul>
<blockquote>
<p>System.FormatException: An error occurred while deserializing the Id property of class Repository.Domain.User.UserInfo: Cannot deserialize a 'String' from BsonType 'ObjectId'.</p>
</blockquote>
<h4>知识拓展MongoDB ObjectId类型概述:</h4>
<blockquote>
<p>每次插入一条数据系统都会自动插入一个_id键,键值不可以重复,它可以是任何类型的,也可以手动的插入,默认情况下它的数据类型是ObjectId,由于MongoDB在设计之初就是用作分布式数据库,所以使用ObjectId可以避免不同数据库中_id的重复(如果使用自增的方式在分布式系统中就会出现重复的_id的值)。<br>ObjectId使用12字节的存储空间,每个字节可以存储两个十六进制数字,所以一共可以存储24个十六进制数字组成的字符串,在这24个字符串中,前8位表示时间戳,接下来6位是一个机器码,接下来4位表示进程id,最后6位表示计数器。</p>












</blockquote>
<p>MongoDB 采用 ObjectId 来表示主键的类型,数据库中每个文档都拥有一个_id 字段表示主键,_id 的生成规则如下:</p>
<blockquote>
<p>其中包括4-byte Unix 时间戳,3-byte 机器 ID,2-byte 进程 ID,3-byte 计数器(初始化随机)</p>












</blockquote>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202303/1336199-20230327213834087-2092438723.png" alt="" class="medium-zoom-image" loading="lazy"></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">601e2b6ba3203cc89f   2d31aa
   ↑      ↑       ↑       ↑
时间戳    机器码   进程ID   随机数 </pre>
</div>
<h2>创建用户Repository</h2>
<h3>创建用户IUserRepository接口</h3>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span> IUserRepository : IMongoRepository&lt;UserInfo&gt;<span style="color: rgba(0, 0, 0, 1)">
    {
    }</span></pre>
</div>
<h3>创建用户UserRepository类</h3>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> UserRepository : MongoBaseRepository&lt;UserInfo&gt;<span style="color: rgba(0, 0, 0, 1)">, IUserRepository
    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> UserRepository(IMongoContext context) : <span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">(context)
      {
      }
    }</span></pre>
</div>
<h2>创建用户管理业务代码</h2>
<h3>创建IUserOperationExampleServices接口</h3>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> IUserOperationExampleServices
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 获取所有用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      Task&lt;IEnumerable&lt;UserInfo&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> GetAllUserInfos();

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 用户分页数据获取
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfoByPageListReq"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfoByPageListReq</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      Task&lt;IEnumerable&lt;UserInfo&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> GetUserInfoByPageList(UserInfoByPageListReq userInfoByPageListReq);

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 通过用户ID获取对应用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="id"&gt;</span><span style="color: rgba(0, 128, 0, 1)">id</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      Task&lt;UserInfo&gt; GetUserInfoById(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> id);

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 添加用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfo"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfo</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      Task&lt;UserInfo&gt;<span style="color: rgba(0, 0, 0, 1)"> AddUserInfo(UserInfoReq userInfo);

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 事务添加用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfo"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfo</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      Task&lt;UserInfo&gt;<span style="color: rgba(0, 0, 0, 1)"> AddUserInfoTransactions(UserInfoReq userInfo);

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 用户信息修改
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="id"&gt;</span><span style="color: rgba(0, 128, 0, 1)">id</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfo"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfo</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      Task&lt;UserInfo&gt; UpdateUserInfo(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> id, UserInfoReq userInfo);

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 用户信息删除
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="id"&gt;</span><span style="color: rgba(0, 128, 0, 1)">id</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      Task&lt;<span style="color: rgba(0, 0, 255, 1)">bool</span>&gt; Delete(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> id);
    }</span></pre>
</div>
<h3>创建UserOperationExampleServices类</h3>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> UserOperationExampleServices : IUserOperationExampleServices
    {
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">readonly</span><span style="color: rgba(0, 0, 0, 1)"> IUnitOfWork _unitOfWork;
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">readonly</span><span style="color: rgba(0, 0, 0, 1)"> IUserRepository _userRepository;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 依赖注入
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="unitOfWork"&gt;</span><span style="color: rgba(0, 128, 0, 1)">unitOfWork</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userRepository"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userRepository</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> UserOperationExampleServices(IUnitOfWork unitOfWork, IUserRepository userRepository)
      {
            _unitOfWork </span>=<span style="color: rgba(0, 0, 0, 1)"> unitOfWork;
            _userRepository </span>=<span style="color: rgba(0, 0, 0, 1)"> userRepository;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 获取所有用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;IEnumerable&lt;UserInfo&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> GetAllUserInfos()
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> getAllUserInfos = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.GetAllAsync();
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> getAllUserInfos;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 用户分页数据获取
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfoByPageListReq"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfoByPageListReq</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;IEnumerable&lt;UserInfo&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> GetUserInfoByPageList(UserInfoByPageListReq request)
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建查询条件构造器</span>
            FilterDefinitionBuilder&lt;UserInfo&gt; buildFilter = Builders&lt;UserInfo&gt;<span style="color: rgba(0, 0, 0, 1)">.Filter;
            FilterDefinition</span>&lt;UserInfo&gt; filter =<span style="color: rgba(0, 0, 0, 1)"> buildFilter.Empty;
            SortDefinition</span>&lt;UserInfo&gt; sort = Builders&lt;UserInfo&gt;.Sort.Ascending(m =&gt;<span style="color: rgba(0, 0, 0, 1)"> m.CreateDate);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(request.NickName))
            {
                filter </span>= buildFilter.Eq(m =&gt;<span style="color: rgba(0, 0, 0, 1)"> m.NickName, request.NickName);
            }

            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(request.Id))
            {
                filter </span>= buildFilter.Eq(m =&gt;<span style="color: rgba(0, 0, 0, 1)"> m.Id, request.Id);
            }

            </span><span style="color: rgba(0, 0, 255, 1)">var</span> list = <span style="color: rgba(0, 0, 255, 1)">await</span> _userRepository.FindListByPageAsync(filter, request.PageIndex, request.PageSize, Array.Empty&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt;<span style="color: rgba(0, 0, 0, 1)">(), sort);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> list;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 通过用户ID获取对应用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="id"&gt;</span><span style="color: rgba(0, 128, 0, 1)">id</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;UserInfo&gt; GetUserInfoById(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> id)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> getUserInfo = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.GetByIdAsync(id);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> getUserInfo;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 添加用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfo"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfo</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;UserInfo&gt;<span style="color: rgba(0, 0, 0, 1)"> AddUserInfo(UserInfoReq userInfo)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> addUserInfo = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> UserInfo()
            {
                Id </span>=<span style="color: rgba(0, 0, 0, 1)"> ObjectId.GenerateNewId().ToString(),
                UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo.UserName,
                Email </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo.Email,
                NickName </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo.NickName,
                Password </span>=<span style="color: rgba(0, 0, 0, 1)"> MD5Helper.MDString(userInfo.Password),
                Status </span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">,
                HeadPortrait </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo.HeadPortrait,
                CreateDate </span>=<span style="color: rgba(0, 0, 0, 1)"> DateTime.Now,
                UpdateDate </span>=<span style="color: rgba(0, 0, 0, 1)"> DateTime.Now,
            };
            </span><span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.AddAsync(addUserInfo);
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> queryUserInfo = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.GetByIdAsync(addUserInfo.Id);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> queryUserInfo;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 事务添加用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfo"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfo</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;UserInfo&gt;<span style="color: rgba(0, 0, 0, 1)"> AddUserInfoTransactions(UserInfoReq userInfo)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">using</span> <span style="color: rgba(0, 0, 255, 1)">var</span> session = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _unitOfWork.InitTransaction();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> addUserInfo = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> UserInfo()
            {
                Id </span>=<span style="color: rgba(0, 0, 0, 1)"> ObjectId.GenerateNewId().ToString(),
                UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo.UserName,
                Email </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo.Email,
                NickName </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo.NickName,
                Password </span>=<span style="color: rgba(0, 0, 0, 1)"> MD5Helper.MDString(userInfo.Password),
                Status </span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">,
                HeadPortrait </span>=<span style="color: rgba(0, 0, 0, 1)"> userInfo.HeadPortrait,
                CreateDate </span>=<span style="color: rgba(0, 0, 0, 1)"> DateTime.Now,
                UpdateDate </span>=<span style="color: rgba(0, 0, 0, 1)"> DateTime.Now,
            };
            </span><span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.AddTransactionsAsync(session, addUserInfo);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查不到任何信息</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> queryUserInfo = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.GetByIdAsync(addUserInfo.Id);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交新增用户信息操作</span>
            <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _unitOfWork.Commit(session);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">UserInfo只有在提交后才会被添加</span>
            queryUserInfo = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.GetByIdAsync(addUserInfo.Id);

            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> queryUserInfo;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 用户信息修改
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="id"&gt;</span><span style="color: rgba(0, 128, 0, 1)">id</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfo"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfo</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;UserInfo&gt; UpdateUserInfo(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> id, UserInfoReq userInfo)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">#region</span> 指定字段和条件修改

            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">修改条件</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> list = <span style="color: rgba(0, 0, 255, 1)">new</span> List&lt;FilterDefinition&lt;UserInfo&gt;&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                Builders</span>&lt;UserInfo&gt;.Filter.Eq(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">_id</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ObjectId(id))
            };
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> filter = Builders&lt;UserInfo&gt;<span style="color: rgba(0, 0, 0, 1)">.Filter.And(list);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">指定要修改的字段内容
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">参考文章:</span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">https://chsakell.gitbook.io/mongodb-csharp-docs/crud-basics/update-documents</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> updateDefinition = Builders&lt;UserInfo&gt;<span style="color: rgba(0, 0, 0, 1)">.Update.
                Set(u </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> u.HeadPortrait, userInfo.HeadPortrait).
                Set(u </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> u.NickName, userInfo.NickName).
                Set(u </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> u.Status, userInfo.Status);

            </span><span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.UpdateAsync(filter, updateDefinition);

            </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span>

            <span style="color: rgba(0, 0, 255, 1)">#region</span> 指定对象异步修改一条数据

            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">var updateUserInfo = new UserInfo
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">{
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">    UserName = userInfo.UserName,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">    Password = MD5Helper.MDString(userInfo.Password),
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">    Status = 1,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">    HeadPortrait = userInfo.HeadPortrait,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">    Email = userInfo.Email,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">    NickName = userInfo.NickName,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">    UpdateDate = DateTime.Now,
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">};
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">await _userRepository.UpdateAsync(updateUserInfo, id);</span>

            <span style="color: rgba(0, 0, 255, 1)">#endregion</span>

            <span style="color: rgba(0, 0, 255, 1)">#region</span> 数据批量修改示例

            <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)">/1.批量修改的条件(把创建时间CreateDate为近五日的用户状态更改为0)</span>
            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">var time = DateTime.Now;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">var list = new List&lt;FilterDefinition&lt;UserInfo&gt;&gt;();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">list.Add(Builders&lt;UserInfo&gt;.Filter.Gt("CreateDate", time));</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">大于当前时间
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">list.Add(Builders&lt;UserInfo&gt;.Filter.Lt("CreateDate", time.AddDays(5)));</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">小于当前时间+5day
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">var filter = Builders&lt;UserInfo&gt;.Filter.And(list);</span>

            <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)">/2.要修改的字段内容</span>
            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">var dic = new Dictionary&lt;string, string&gt;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">{
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">    { "Status", "0" }
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">};</span>

            <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)">/3.批量修改</span>
            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">await _userRepository.UpdateManayAsync(dic, filter);</span>

            <span style="color: rgba(0, 0, 255, 1)">#endregion</span>

            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.GetByIdAsync(id);
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 用户信息删除
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="id"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;<span style="color: rgba(0, 0, 255, 1)">bool</span>&gt; Delete(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> id)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.DeleteAsync(id);
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> testUserInfo = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userRepository.GetByIdAsync(id);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> testUserInfo == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }</span></pre>
</div>
<h2>UserOperationExample控制创建</h2>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> MongoDB用户管理操作示例
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">   
   
    /</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)]
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> UserOperationExampleController : ControllerBase
    {
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">readonly</span><span style="color: rgba(0, 0, 0, 1)"> IUserOperationExampleServices _userOperationExampleServices;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 依赖注入
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userOperationExampleServices"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userOperationExampleServices</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> UserOperationExampleController(IUserOperationExampleServices userOperationExampleServices)
      {
            _userOperationExampleServices </span>=<span style="color: rgba(0, 0, 0, 1)"> userOperationExampleServices;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 获取所有用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">      
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;ActionResult&lt;IEnumerable&lt;UserInfo&gt;&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> GetAllUserInfos()
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> userInfos = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userOperationExampleServices.GetAllUserInfos();
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Ok(userInfos);
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 获取用户分页数据
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfoByPageListReq"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfoByPageListReq</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">      
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;ActionResult&lt;IEnumerable&lt;UserInfo&gt;&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> GetUserInfoByPageList( UserInfoByPageListReq userInfoByPageListReq)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> getUserInfoByPageList = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userOperationExampleServices.GetUserInfoByPageList(userInfoByPageListReq);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Ok(getUserInfoByPageList);
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 通过用户ID获取对应用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="id"&gt;</span><span style="color: rgba(0, 128, 0, 1)">id</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;ActionResult&lt;UserInfo&gt;&gt; GetUserInfoById(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> id)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> userInfo = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userOperationExampleServices.GetUserInfoById(id);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Ok(userInfo);
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 添加用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfo"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfo</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">      
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;ActionResult&lt;UserInfo&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> AddUserInfo( UserInfoReq userInfo)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> addUserInfo = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userOperationExampleServices.AddUserInfo(userInfo);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Ok(addUserInfo);
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 事务添加用户信息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfo"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfo</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">      
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;ActionResult&lt;UserInfo&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> AddUserInfoTransactions( UserInfoReq userInfo)
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TODO:单机服务器不支持事务使用【使用MongoDB事务会报错:Standalone servers do not support transactions】,只有在集群情况下才能用</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> addUserInfo = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userOperationExampleServices.AddUserInfoTransactions(userInfo);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Ok(addUserInfo);
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 用户信息修改
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="id"&gt;</span><span style="color: rgba(0, 128, 0, 1)">id</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="userInfo"&gt;</span><span style="color: rgba(0, 128, 0, 1)">userInfo</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;ActionResult&lt;UserInfo&gt;&gt; UpdateUserInfo(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> id, UserInfoReq userInfo)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> updateUserInfo = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userOperationExampleServices.UpdateUserInfo(id, userInfo);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Ok(updateUserInfo);
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 用户信息删除
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="id"&gt;</span><span style="color: rgba(0, 128, 0, 1)">id</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task&lt;ActionResult&gt; Delete(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> id)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> deleteUser = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> _userOperationExampleServices.Delete(id);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Ok(deleteUser);
      }
    }</span></pre>
</div>
<h2>注册数据库基础操作和工作单元</h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注册数据库基础操作和工作单元</span>
builder.Services.AddSingleton&lt;IMongoConnection, MongoConnection&gt;<span style="color: rgba(0, 0, 0, 1)">();
builder.Services.AddScoped</span>&lt;IMongoContext, MongoContext&gt;<span style="color: rgba(0, 0, 0, 1)">();
builder.Services.AddScoped</span>&lt;IUnitOfWork, UnitOfWork&gt;<span style="color: rgba(0, 0, 0, 1)">();
builder.Services.AddScoped</span>&lt;IUserRepository, UserRepository&gt;();</pre>
</div>
<h2>注册相关应用服务</h2>
<div class="cnblogs_code">
<pre>builder.Services.AddScoped&lt;IUserOperationExampleServices, UserOperationExampleServices&gt;();</pre>
</div>
<h2>Swagger用户管理操作示例展示</h2>
<h3>添加用户信息</h3>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408120434744-1491332643.png" alt="" loading="lazy"></p>
<p><strong>&nbsp;添加成功,返回添加成功的用户信息:</strong></p>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408120512409-1982768734.png" alt="" loading="lazy"></p>
<h3>通过用户ID获取对应用户信息</h3>
<p><strong>拿刚才添加成功的用户ID,查询用户信息:</strong></p>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408120726974-1583274111.png" alt="" loading="lazy"></p>
<h3>获取所有用户信息</h3>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408120902608-731171977.png" alt="" loading="lazy"></p>
<h3>用户分页数据获取</h3>
<p>查询第1页,显示10条数据:</p>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408121533855-194645817.png" alt="" loading="lazy"></p>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408121554091-1666337051.png" alt="" loading="lazy"></p>
<p>查询第1页,显示2条数据:</p>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408121126893-1440857254.png" alt="" loading="lazy"></p>
<p>&nbsp;<img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408121312356-545452564.png" alt="" loading="lazy"></p>
<h3>&nbsp;用户信息修改</h3>
<p>指定要修改的字段内容,修改HeadPortrait、NickName、Status<br>参考文章:https://chsakell.gitbook.io/mongodb-csharp-docs/crud-basics/update-documents</p>
<p>&nbsp;<img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408122109316-2104963625.png" alt="" loading="lazy"></p>
<p>&nbsp;修改成功:</p>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408122144945-1298530128.png" alt="" loading="lazy"></p>
<h3>用户信息删除</h3>
<p>输入需要删除的用户ID,点击Execute删除:</p>
<p><img src="https://img2023.cnblogs.com/blog/1336199/202304/1336199-20230408122346136-1247492688.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <blockquote >
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'><span style='font-size: 17px; '>作者名称:</span>追逐时光者</p>
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'><span style='font-size: 17px; '>作者简介:</span>一个热爱编程、善于分享、喜欢学习、探索、尝试新事物和新技术的全栈软件工程师。</p>
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'>
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如果该篇文章对您有帮助的话,可以点一下右下角的【&hearts;推荐&hearts;】,希望能够持续的为大家带来好的技术文章,文中可能存在描述不正确的地方,欢迎指正或补充,不胜感激。
</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/Can-daydayup/p/17294749.html
頁: [1]
查看完整版本: .NET Core MongoDB数据仓储和工作单元模式实操