我有一个复杂的对象模型,我试图使用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
的范围,所以我在代码的其他地方没有发生一些复制/粘贴事故。我喜欢它的工作方式,它使我的代码可读(至少对我而言,希望是其他人)。
答案 0 :(得分:1)
听起来你只是想要:
using (var p = modelBuilder.Entity<Product>())
{
//...
}
但是,只有modelBuilder.Entity<Product>()
的结果实现IDisposable
时才会有效。通过关于该主题的MSDN信息,看起来它没有。如果没有,你可以做得很好:
var p = modelBuilder.Entity<Product>();
//...