我正在使用ASP.NET MVC 5和Entity Framework 6。
我通过将模型移动到单独的数据项目来尝试遵循Clean Architecture来调整我的设备。
通常,当我拥有同一项目中的所有模型和数据库上下文时,实体框架在上下文中生成映射,以反映我如何定义模型(使用公共虚拟ICollection ...等)指示的关系。
当模型都在一个项目中时,来自数据库上下文的代码示例如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
//many to many Company-Services
modelBuilder.Entity<Company>()
.HasMany(s => s.Services)
.WithMany(c => c.Company)
.Map(cs =>
{
cs.MapLeftKey("CompanyRefId");
cs.MapRightKey("ServiceRefId");
cs.ToTable("CompanyServices");
});
//Staff-Qualifications
modelBuilder.Entity<Staff>()
.HasMany(q => q.Qualifications)
.WithMany(s => s.Staff)
.Map(cs =>
{
cs.MapLeftKey("StaffRefId");
cs.MapRightKey("QualificationRefId");
cs.ToTable("StaffQualifications");
});
}
但是现在我将模型放在同一解决方案中的单独数据项目中,数据库上下文不再具有此代码。它只有我在下面包含的这个简单的Fluent API代码。
当模型位于同一解决方案中的单独项目中时,上下文中的代码:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
在服务器管理工作室中检查后,表格在数据库中以相同的方式生成,就像模型构建器代码在那里一样。
我发现这令人震惊,并想知道如果没有Fluent API,表格及其关系如何仍然正确生成。我在项目中搜索了模型构建器代码,但无法在任何地方找到它。
缺少此Fluent API代码是否存在问题或潜在问题?任何人都知道这是如何工作的,如果它似乎不需要这个代码来建立数据库关系?
按照惯例,数据库映射可使用基于属性的配置或Fluent API进行自定义。见Code-First Conventions
因此,即使没有任何显式配置,EF也可以生成数据库。