使用 FluentAPI 和 Code First 在 EF6 的 DbContext 中进行功能分组

Functional grouping in DbContext for EF6 using FluentAPI and Code First

我有一个复杂的对象模型,我正试图使用​​ FluentAPI 对其进行严格控制。我最终得到的大块代码如下所示:

        modelBuilder.Entity<Product>().Property(t => t.Category).IsRequired();
        modelBuilder.Entity<Product>().Property(t => t.Description).IsOptional();
        modelBuilder.Entity<Product>().Property(t => t.Name).IsRequired();
        modelBuilder.Entity<Product>().Property(t => t.PricingAnalyst).IsOptional();
        modelBuilder.Entity<Product>().Property(t => t.ProductCode).IsRequired();
        modelBuilder.Entity<Product>().Property(t => t.ReplacedByProductCode).IsOptional();
        modelBuilder.Entity<Product>().Property(t => t.Section).IsOptional();
        modelBuilder.Entity<Product>().HasMany<ProductReference>(s => s.References);
        modelBuilder.Entity<Product>().HasMany<ProductWeight>(s => s.Weights);
        modelBuilder.Entity<Product>().HasMany<ProductDate>(s => s.Dates);
        modelBuilder.Entity<Product>().HasMany<ProductNote>(s => s.Notes);
        modelBuilder.Entity<Product>().HasMany<Rule>(s => s.Rules);
        modelBuilder.Entity<Product>().HasOptional<PriceDetail>(s => s.Pricing);
        modelBuilder.Entity<Product>().HasOptional<ProductCosting>(s => s.Costing);
        modelBuilder.Entity<Product>().HasMany<Update>(u => u.Updates);

在我看来,如果我能做点什么来达到

的效果,我就可以停止输入这么多 modelBuilder.Entity<Product>()
using (modelBuilder.Entity<Product>() p)
{
    p.Property(t => t.PricingAnalyst).IsOptional();
    ...
    p.HasMany<ProductReference>(s => s.References);
}

会节省我很多精力,但我不知道如何正确构建 using 语句。这是正确的道路吗?如果不是,我该如何 shorthand 代码并使其更具可读性?

更新:

根据提供的答案,我在我的 :DbContext 文件中创建了类似于以下内容的块:

        {
            var rule = modelBuilder.Entity<Rule>();
            rule.HasKey(r => r.ID);
            rule.Property(r => r.Country).IsRequired();
            rule.Property(r => r.Description).IsOptional();
            rule.Property(r => r.ReviewDate).IsOptional();
            rule.Property(r => r.RuleNumber).IsRequired();
            rule.HasMany<Update>(r => r.Updates);
            rule.HasMany<Condition>(r => r.Conditions);
        }

我选择用大括号将每个块括起来以包含 var 的范围,这样我就不会在代码的其他地方出现一些 copy/paste 意外。我喜欢它的工作方式,它使我的代码可读(至少对我而言,希望对其他人而言)。

听起来你只是想要:

using (var p = modelBuilder.Entity<Product>())
{
    //...
}

但是,这仅在 modelBuilder.Entity<Product>() 的结果实现 IDisposable 时才有效。浏览有关该主题的 MSDN 信息,似乎没有。如果没有,你可能可以做得很好:

var p = modelBuilder.Entity<Product>();
//...