实体框架,流畅的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。
@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文件的问题应该是另一个问题。