Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ef core fluent api设置所有列类型的接口_C#_Entity Framework_.net Core_Entity Framework Core_Ef Fluent Api - Fatal编程技术网

C# Ef core fluent api设置所有列类型的接口

C# Ef core fluent api设置所有列类型的接口,c#,entity-framework,.net-core,entity-framework-core,ef-fluent-api,C#,Entity Framework,.net Core,Entity Framework Core,Ef Fluent Api,不幸的是,efcore不支持TPC模式,但我们需要这种行为。我编写了一个称为IBase的接口,每个实体都实现了这个接口: public interface IBase { Guid Id { get; set; } [Column(TypeName = "datetime2")] DateTime CreateDate { get; set; } [Required] [StringLength(255)] string CreateUser

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

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; }
}
我想去掉注释,改用fluentapi配置。但是我有大约20个不同的实体和7个基本值,我不想一次又一次地进行相同的配置:

 modelBuilder.Entity<SomeEntity>()
            .Property(e => e.CreateDate)
            .HasColumnType("datetime2(2)")
            .IsRequired();
modelBuilder.Entity()
.Property(e=>e.CreateDate)
.HasColumnType(“日期时间2(2)”)
.IsRequired();

如何为实现IBase的所有实体一次性配置每个基本属性?EF core非常适合基类/继承,因此只需创建一个基本泛型类并将常见内容放入其中,然后从这些基类继承模型,如下所示:

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

此解决方案适用于实体框架而非核心:

        modelBuilder.Types<BaseModel>().Configure((configuration) =>
        {
            configuration.Property(p => p.CreateUser)
                .HasMaxLength(250)
                .IsRequired();
        });
modelBuilder.Types().Configure((配置)=>
{
属性(p=>p.CreateUser)
.HasMaxLength(250)
.IsRequired();
});

首先:感谢您的努力!但是我的“TPC”提示呢?基类不适合我,除非您能告诉我如何在每个数据库表中拥有所有的基值。EF 6提供了3种不同的模式(TPH、TPC和TPT),EF core仅支持TPH。所以你的答案“在内容上”是正确的,但实际上并不是对我问题的回答(直到现在)…先试试看。它将为每种混凝土类型创建单独的表。这就是TPC。第二部分-配置与模型继承完全无关,它是关于配置继承的,所以您可以使用接口或任何东西。对不起!!我试过了,你是对的——它很有效!但我希望至少有一点是正确的……)您的第二个声明不正确-如果我尝试使用EntityTypeBuilder的接口,我会遇到以下错误:为参数“clrType”提供的实体类型“EfTEst.IBase”必须是引用类型。使用如下声明可以轻松解决此问题:
BaseConfiguration,其中TBase:class,IBase