【发布时间】:2014-08-12 04:34:03
【问题描述】:
问题:
我的问题是我是否正确地处理了这个问题,或者是否有一种更整洁/更强大的方式来使用 Fluent API 映射实体?主要是,我应该在覆盖的OnModelCreating 方法中进行所有映射吗?其次,有什么理由不这样做吗?最后,如果我的数据模型正常工作,并且我能够成功访问数据库,为什么 Entity Framework Power Tools 无法生成只读的 .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
在提供对所有实体的访问的 DbSets 之后,我在 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 非常冗长。
【问题讨论】:
标签: c# asp.net database entity-framework ef-code-first