.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
代码如下:
最后,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