EF Core - 如何根据所使用的数据库提供程序配置列类型

7
每个数据库提供商都有不同的数据类型,这些类型会映射到相同的C#类型(Guid / DateTime)。
我希望根据使用的数据库提供商配置列类型。
例如:
public class MyClass
{
    public Guid Id { get; set; }
    public DateTime CreatedOn { get; set; }
}

如果使用的是 Sql Server
  • DateTime 配置为 datetime2(0)
如果使用的是 MySql Server
  • DateTime 配置为 TIMESTAMP
  • Guid 配置为 CHAR(36)
因此,我正在寻找类似以下代码的内容:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    if(IsSqlServer)
    {
        modelBuilder.Entity<MyClass>()
            .Property(e => e.CreatedOn)
            .HasColumnType("datetime2(0)")
            ;
    }
    else if(IsMySqlServer) 
    {
        modelBuilder.Entity<MyClass>()
            .Property(e => e.CreatedOn)
            .HasColumnType("TIMESTAMP")
            ;

        modelBuilder.Entity<MyClass>()
            .Property(e => e.Id)
            .HasColumnType("CHAR(36)")
            ;
    }
}

最新稳定版本的EF Core(3.1)能否实现这一点?

1个回答

6

在DbContext中,您可以使用this.Database.ProviderName

if (this.Database.ProviderName == "Microsoft.EntityFrameworkCore.SqlServer")
{
    modelBuilder.Entity<MyClass>()
        .Property(e => e.CreatedOn)
        .HasColumnType("datetime2(0)")
        ;
}

有些供应商还包括扩展方法,以帮助解决这个问题。

if (this.Database.IsSqlServer())
{
    modelBuilder.Entity<MyClass>()
        .Property(e => e.CreatedOn)
        .HasColumnType("datetime2(0)")
        ;
}

通常情况下,最好使用诸如 Database.IsSqlServer() 这样的简化方法。https://github.com/dotnet/efcore/blob/3bd012b6dc645f6d4e14ddb473c42f3fa4e0b98b/src/EFCore/Infrastructure/DatabaseFacade.cs#L310-L312 - altso
当我们在 IEntityTypeConfiguration<ModelType> 类中时怎么样? - Majid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接