如何确定 IEntityTypeConfiguration 处的数据库提供程序,因为我支持多个数据库

Chr*_*aan 2 mysql sql-server asp.net-core-mvc entity-framework-migrations

谁能告诉我如何在第 9 行获取当前的数据库提供程序?因此它可以为MySQL迁移正确生成迁移。我该如何以干净的方式做到这一点。

1 internal class GroupConfiguration : IEntityTypeConfiguration<Group>
2 {
3   public void Configure(EntityTypeBuilder<Group> builder)
4   {
5      builder.ToTable(nameof(Group));
6      builder.HasKey("Id");
7      builder.Property(u => u.Id)
8         .ValueGeneratedOnAdd()
9         .HasDefaultValueSql((database.IsMySql()) ? "uuid()" : "newsequentialid()");
...
Run Code Online (Sandbox Code Playgroud)

我正在使用 .NET Core 3.1,并且我的 web 应用程序支持多个数据库提供程序。目前是 MySQL (Pomelo) 和 SQL Server。我需要它以正确的方式生成迁移。所以我有 MySQL 和 SQL Server 迁移。

但我不想手动更新 MySQL 生成的迁移。

Chr*_*eld 5

技巧是将 传递DatabaseFacade给您的配置类:

internal class GroupConfiguration : IEntityTypeConfiguration<Group>
{
   private readonly DatabaseFacade _database;

   public GroupConfiguration(DatabaseFacade database)
   {
        _database = database;
   }

   public void Configure(EntityTypeBuilder<Group> builder)
   {
      builder.ToTable(nameof(Group));
      builder.HasKey("Id");
      builder.Property(u => u.Id)
         .ValueGeneratedOnAdd()
         .HasDefaultValueSql((_database.IsMySql()) ? "uuid()" : newsequentialid()");
...
Run Code Online (Sandbox Code Playgroud)

然后将Database属性传递给OnModelCreating

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // ...
    modelBuilder.ApplyConfiguration(new GroupConfiguration(Database));
    // ...
}
Run Code Online (Sandbox Code Playgroud)

请记住,配置类无法再由 创建modelBuilder.ApplyConfigurationsFromAssembly(),因此您必须使用 添加配置modelBuilder.ApplyConfiguration()