【问题标题】:Is it possible to move fluent configuration of a hierarchy in a separate class?是否可以在单独的类中移动层次结构的流畅配置?
【发布时间】:2018-12-06 17:38:55
【问题描述】:

我有一个层次结构,我想在一个类中配置它。有可能吗?

目前我有IEntityTypeConfiguration<> 接口的N 实现 - 层次结构中的每个实体一个。

【问题讨论】:

  • “层次结构”是什么意思?基础/派生实体(继承)还是其他?
  • 没错。继承。

标签: c# entity-framework-core ef-core-2.2


【解决方案1】:

当然可以。毕竟,您根本不必使用IEntityTypeConfiguration<> - 您可以在OnModelCreating 中配置所有您的实体。此外,所有ApplyConfiguration 泛型方法所做的就是调用实现IEntityTypeConfiguration<TEntity> 接口的类的Configure 方法,传递EntityTypeBuilder<TEntity> 实例,您通常从modelBuilder.Entity<TEntity>() 调用(或作为Action<> 的参数接收)该方法的第二次重载)。

因此,您可以将代码放在任何接收ModelBuilder 实例的静态或实例类方法中。如果你想使用类,它不应该实现IEntityTypeConfiguration<>,因为没有办法从“EntityTypeBuilder”获取ModelBuilder,你需要它才能配置基实体和派生实体。

例如,像这样的:

class MyHierarchyConfiguration
{
    public void Apply(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyBaseEntity>(builder =>
        {
            // base entity configuration here
        });
        modelBuilder.Entity<MyDerivedEntity1>(builder =>
        {
            // derived entity configuration here
        });
        modelBuilder.Entity<MyDerivedEntity2>(builder =>
        {
            // derived entity configuration here
        });
        // etc.
    }
}

OnModelCreating内部:

new MyHierarchyConfiguration().Apply(modelBuilder);

【讨论】:

  • 这确实是一个可行的解决方案,但也许值得在构造函数中接受modelBuilder,然后用暴露类/接口的 API 包装它,从而将类型限制为层次结构。一方面它是矫枉过正,另一方面它是意图的明确表达 - 配置层次结构。
  • 因为它封装了所有的配置代码,我不明白你如何约束它或提供API。事实上,这种方法不受层次结构的限制——它可以用来封装任何(相关)实体集的流畅配置。如果意图只是共享通用的基本配置,那么解决方案是不同的——通用基本配置类 (MyEntityConfiguration&lt;TEntity&gt; where TEntity : BaseEntity) 和继承它的每个派生实体的派生配置类(以配置特定方面)。但这不是“一类”解决方案。
  • 而且我没有使用构造函数/类状态,因为我想表明配置的无状态性质——Apply 方法可以设为静态,或者类可以设为单例。 DI 不能用于解析ModelBuilder 实例(它是OnConfiguring 的参数),因此使用构造函数/状态没有真正的好处。只是从DbContext 移出的一段共享代码。
  • 但是泛型版本允许我们定义基类。 abstract class ConfigureHierarcy&lt;TBase&gt;。实现者必须重写Configure,它接受“特殊”构建器,它将配置实体的类型限制为TBase的继承者。
  • 是的,确实如此。但请注意,它必须与 actual 类一起调用,换句话说,对于每个派生类。它更适合不使用 EF 继承的层次结构 - 只是基类。如果这就是您所问的,那么答案会有所不同 - 例如stackoverflow.com/questions/49990365/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
相关资源
最近更新 更多