ef core fluent api 设置接口的所有列类型 [英] Ef core fluent api set all column types of interface

查看:42
本文介绍了ef core fluent api 设置接口的所有列类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Unfortunately ef core does not support TPC-pattern, but we need this kind of behaviour. I´ve wrote an interface which is called IBase and each entity implements this 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 个基本值,我不想一遍又一遍地进行相同的配置:

I want to get rid of Annotations to use the Fluent API configuration instead. But I have about 20 different entities and 7 Base-Values and I don´t want to make the same configuration over and over again:

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

任何想法如何为实现 IBase 的所有实体配置每个 Base-Property 一次?

Any ideas how to configure each Base-Property once for all entities implementing IBase?

推荐答案

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

EF core perfectly fine with base classes/inheritance, so just create an base generic class and put common things into it and then inherit your models from those base class like that:

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 方法中应用这些配置,有点像:


If for some reason it's deadly important for you to use fluentapi than there is a configuration interface exists called IEntityTypeConfiguration<TModel> and all what you need is again create base configuration and latter inherit specific configurations from it. And after that apply those configurations in your DbContext.OnModelCreating method somewhat like that:

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());
    }
}

这篇关于ef core fluent api 设置接口的所有列类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆