实体框架,流畅的API映射,应该在OnModelCreating以外的地方完成

本文关键字:OnModelCreating 方完成 映射 框架 API 实体 | 更新日期: 2023-09-27 18:09:35

问题:

我的问题是,如果我这样做是正确的,或者是否有一个更整洁/更强大的方式映射实体与Fluent API?主要是,我应该在覆盖的OnModelCreating方法中做所有的映射吗?其次,有什么理由不这样做吗?最后,如果我的数据模型正在工作,我能够成功访问数据库,为什么实体框架电动工具不能生成只读的。edmx文件?


下面是我正在做的事情的背景故事和示例:

所以我有一个工作代码优先的数据模型,大约70个非常相互关联的实体。我从一个已经使用实体框架设计器来关联对象并将它们映射到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 s提供对所有实体的访问之后,我在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。

实体框架,流畅的API映射,应该在OnModelCreating以外的地方完成

@Gert Arnold很好地回答了你的第一个问题。关于EF电动工具,他们可能只是在试图发现你的模型时挂断了电话。您可以使用下面的代码片段手动执行相同的操作。

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

我认为就性能而言,无论您是通过单独的EntityTypeConfiguration类进行配置还是仅在OnModelCreating中进行配置,都没有明显的差异。

但是计算机语言的发明并不是为了帮助计算机,而是为了帮助我们,二元阅读障碍类型。因此,我更喜欢EntityTypeConfiguration s,因为它可以帮助您更快地获得特定的映射,而不是滚动6000行代码。我们开发人员花了很多时间参考我们或其他人以前写的东西。

我认为关于EF电动工具不生成只读。edmx文件的问题应该是另一个问题。