我的问题是,如果我正确地解决这个问题,或者是否有一种更整洁/更健壮的方法来使用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非常冗长。
答案 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文件的问题应该是一个不同的问题。它需要有关该特定问题的更多详细信息。