实体框架,Fluent API映射,是否应该在OnModelCreating之外的其他地方完成?

时间:2014-06-21 17:00:15

标签: c# asp.net database entity-framework ef-code-first

问题:

我的问题是,如果我正确地解决这个问题,或者是否有一种更整洁/更健壮的方法来使用Fluent API映射实体?主要是,我应该在覆盖的OnModelCreating方法中进行所有映射吗?其次,有没有理由不这样做?最后,如果我的数据模型正常工作,并且我能够成功访问数据库,为什么Entity Framework Power Tools无法生成只读的.edmx文件?


以下是我正在做的事情的背景故事和例子:

所以我有一个约70个非常互连的实体的代码优先数据模型。我从已经使用的现有数据库和Entity-Framework设计器反向设计它来关联对象并将它们映射到SQL数据库。

我在我完成的教程上建模了我的方法,并且我使用Fluent API进行映射,而不是使用数据注释。

所以我将所有实体模型定义为POCO,每个模型都在自己的源文件中。我有另一个继承DbContext的类,我们称之为MyDb。在MyDb内,我有~70 DbSet个属性

public virtual DbSet<SomeEntity> SomeEntities{ get; set; }
public virtual DbSet<OtherEntity> OtherEntities{ get; set; }
//...You get the idea, there another few dozen of these below
public virtual DbSet<LastEntity> LastEntities{ get; set; }
//Well that was tedious

在提供对所有实体的访问权限的DbSet之后,我在protected override void OnModelCreating(DbModelBuilder mb)内部有大约6000行流畅的API映射,这就是我在示例中学习的方法,以及我做过的小型测试项目。

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Entity<SomeEntity>()
       .ToTable("SomeEntities")
       .HasKey(se => se.ID);

    mb.Entity<SomeEntity>()
       .Property(se => se.ID)
       .HasColumnName("ID")
       .HasColumnType("bigint")
       .IsRequired()
       .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

    mb.Entity<SomeEntity>()
       .Property(se => se.Contents)
       .HasColumnName("Content")
       .HasColumnType("varchar")
       .IsMaxLength()
       .IsUnicode(true)
       .IsRequired()
       .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

    mb.Entity<SomeEntity>()
        .HasMany(se => se.OtherEntities)
        .WithRequired(oe => oe.SomeEntity)
        .HasForeignKey(oe => oe.SomeEntity_ID);

    //and so on, there are another ~70 of these that go on for the 
    //next 6000 lines

}

显然,我的所有实体都不是这么简单,并且有许多实体在其属性命名,表命名,表格类型等方面都是非常规的;这就是为什么我对Fluent API非常冗长。

2 个答案:

答案 0 :(得分:2)

@Gert Arnold在回答你的第一个任务时做得很好。关于EF Power Tools,他们可能只是在试图发现你的模型时被挂起。您可以使用以下代码段手动执行相同的操作。

using (var db = new MyContext())
using (var writer = XmlWriter.Create("MyContext.edmx"))
{
    EdmxWriter.WriteEdmx(db, writer);
}

答案 1 :(得分:1)

我认为就性能而言,无论是通过单独的EntityTypeConfiguration类还是仅使用OnModelCreating进行配置,都没有明显的区别。

但计算机语言不是为了帮助计算机而发明的,而是我们的二元不和谐类型。因此,我更喜欢EntityTypeConfiguration,因为这可以帮助您更快地到达特定的映射,而不是滚动6000行代码。我们开发人员花了很多时间回顾我们或其他人之前写过的内容。

我认为关于EF Power Tools不生成只读.edmx文件的问题应该是一个不同的问题。它需要有关该特定问题的更多详细信息。