1

不幸的是,如果核心不支持TPC模式,但我們需要這種行爲。從來就寫道:這就是所謂的iBASE的接口和每個實體實現了這個接口:Ef core fluent api設置接口的所有列類型

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

我想擺脫註解的使用流利的API配置,而不是。但我有大約20個不同的實體和7基本價值觀和我不希望在作出同樣的配置一遍又一遍:

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

任何想法如何實現IBASE所有實體配置各基礎屬性一次?

回答

7

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比使用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()); 
    } 
} 
+0

首先:感謝您的努力!但是我的「TPC」 - 提示呢?基類不適合我,除非你能告訴我,我如何能夠在每個數據庫表中擁有所有的基值。 EF 6提供了3種不同的模式(TPH,TPC和TPT),ef核心只支持TPH。所以你的回答是正確的「內容」,但不是真正的答案我的問題(直到現在)... – Joshit

+0

先試一下。它將爲每個具體類型創建單獨的表格。所以這是TPC。第二部分配置與模型繼承沒有任何關係,它是關於配置繼承,所以你可以使用接口或其他。 – Ph0en1x

+0

對不起!我試過了,你說得對 - 它有效!但是我想至少有一點是正確的;;)你的第二個要求是不正確的 - 如果我嘗試使用EntityTypeBuilder的接口,我得到以下錯誤:爲參數'clrType提供的實體類型'EfTEst.IBase' '必須是參考類型。 – Joshit

相關問題