使用 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>();
//...
我有一个复杂的对象模型,我正试图使用 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>();
//...