.net core cap - mysql

CAP项目初始化见链接

前文使用in memory DB和Queue,这里尝试把in-memory DB改为MySQL

安装DotNetCore.CAP.MySql

安装Mkicrosoft.EntityFrameworkCore.Design, Dapper, Pomelo.EntityFrameworkCore.MySql

本地或者Docker安装MySql、Workbench。 安装完成后,创建schema和db(这个步骤也可以用.net migration完成)

打开前一篇文章中的源码, 添加文件AppDbContext.cs,内容如下

using Microsoft.EntityFrameworkCore;

namespace cap.demo.MySql
{
    public class Person
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public override string ToString()
        {
            return $"Name:{Name}, Id:{Id}";
        }
    }


    public class AppDbContext : DbContext
    {
        public const string ConnectionString = "server=127.0.0.1;port=3306;database=cap;charset=utf8;uid=root;pwd=root;";

        public DbSet<Person> Persons { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySql(ConnectionString, ServerVersion.AutoDetect(ConnectionString));
        }
    }
}

这里的connectionString应该保存在AppSetting.json中,这里为了简化,直接写了固定值。 但这绝不是正确的做法。

打开Program.cs, 注释之前的x.UseInMemoryStorage(), 改为builder.Services.AddDbContext(); 和 x.UseEntityFramework();
代码如下:

最后,PublishController和ConsumerController修改如下

        [Route("~/ef/transaction")]
        [HttpGet]
        public IActionResult EntityFrameworkWithTransaction([FromServices] AppDbContext dbContext)
        {
            using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: false))
            {
                dbContext.Persons.Add(new Person() { Name = "ef.transaction" });

                for (int i = 0; i < 1; i++)
                {
                    _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);
                }

                dbContext.SaveChanges();

                trans.Commit();
            }
            return Ok();
        }
        [NonAction]
        [CapSubscribe("sample.rabbitmq.mysql")]
        public void Subscriber(DateTime p)
        {
            Console.WriteLine($@"{DateTime.Now} Subscriber invoked, Info: {p}");
        }

运行后,可以看到MySQL中多出了两张表:cap.published 和 cap.received

posted @ 2022-07-05 16:11  老胡Andy  阅读(237)  评论(0编辑  收藏  举报