c# - ef core fluent api 设置接口(interface)的所有列类型

标签 c# entity-framework .net-core entity-framework-core ef-fluent-api

不幸的是 ef 核心不支持 TPC 模式,但我们需要这种行为。我写了一个名为 IBase 的接口(interface),每个实体都实现了这个接口(interface):

public interface IBase
{
    Guid Id { get; set; }

    [Column(TypeName = "datetime2")]
    DateTime CreateDate { get; set; }

    [Required]
    [StringLength(255)]
    string CreateUser { get; set; }

    bool Deleted { get; set; }
}

我想摆脱注释,改用 Fluent API 配置。但是我有大约 20 个不同的实体和 7 个基本值,我不想一遍又一遍地进行相同的配置:

 modelBuilder.Entity<SomeEntity>()
            .Property(e => e.CreateDate)
            .HasColumnType("datetime2(2)")
            .IsRequired();

关于如何为所有实现 IBase 的实体配置一次每个 Base-Property 有什么想法吗?

最佳答案

EF 核心非常适合基类/继承,因此只需创建一个基本泛型类并将常用的东西放入其中,然后像这样从这些基类继承您的模型:

public abstract class BaseModel<TId>
{
    TId Id { get; set; }

    [Column(TypeName = "datetime2")]
    DateTime CreateDate { get; set; }

    [Required]
    [StringLength(255)]
    string CreateUser { get; set; }

    bool Deleted { get; set; }
}

class Model : BaseModel<Guid>{ ... //model specific stuff }

如果出于某种原因使用 fluentapi 对您来说非常重要,那么存在一个名为 IEntityTypeConfiguration<TModel> 的配置界面您所需要的只是再次创建基本配置,然后从中继承特定配置。然后在你的 DbContext.OnModelCreating 中应用这些配置有点像这样的方法:

class BaseConfiguration<TBaseModel> : IEntityTypeConfiguration<TBaseModel>
{
    public virtual void Configure(EntityTypeBuilder<TBaseModel> builder)
    {
        builder.Property...
    }
}

class ModelConfiguration : BaseConfiguration<Model>
{
    public override void Configure(EntityTypeBuilder<Model> builder)
    {
         base.Configure(builder)
         ...// model specific stuff
    }
}

class CustomDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.ApplyConfiguration(new ModelConfiguration());
    }
}

关于c# - ef core fluent api 设置接口(interface)的所有列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45943048/

相关文章:

c# - Visual Studio 不在目标框架下拉列表中显示 .NET Core 2.2

c# - 验证带有附件 "the hash value is not correct"的数字签名电子邮件

c# - Entity Framework 代码首先多对多关系不起作用

C# PDF 库来操作 PDF

c# - 我如何在 2 行中同时使用 "\r"c#

entity-framework - 对象层类型 'MyProject.Model.Applications' 已经有一个生成的代理类型

c# - 使用 MySQL 和 EntityFramework 的 DbGeography

c# - 如何从 ASP.NET Core 中的 .json 文件读取 AppSettings 值

asp.net-mvc - 在 MVC 中使用 dotnet core 时如何删除 ErrorViewModel

asp.net-core - UseStatusCodePagesWithRedirects 和 UseStatusCodePagesWithReExecute 之间的区别 - Asp.net core 中的状态代码页