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

时间:2015-03-05 23:11:06

标签: c# entity-framework-6

我有一个复杂的对象模型,我试图使用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语句。这是正确的道路吗?如果没有,我该怎么做才能简化代码并使其更具可读性?

更新

根据提供的答案,我在我的: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的范围,所以我在代码的其他地方没有发生一些复制/粘贴事故。我喜欢它的工作方式,它使我的代码可读(至少对我而言,希望是其他人)。

1 个答案:

答案 0 :(得分:1)

听起来你只是想要:

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

但是,只有modelBuilder.Entity<Product>()的结果实现IDisposable时才会有效。通过关于该主题的MSDN信息,看起来它没有。如果没有,你可以做得很好:

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