【问题标题】:Entity Framework, Fluent API mapping, should it be done somewhere other than OnModelCreating?实体框架、Fluent API 映射,是否应该在 OnModelCreating 以外的地方完成?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了!我得试一试,我会告诉你进展如何!
    【解决方案2】:

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

    但是计算机语言不是为了帮助计算机而发明的,而是为了帮助我们,二元学习型。因此,我更喜欢EntityTypeConfigurations,因为这可以帮助您比滚动浏览 6000 行代码更快地获得特定映射。我们开发人员花费大量时间回顾我们或其他人之前写的内容。

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

    【讨论】:

    • 你能告诉我实体类型配置在代码结构中的位置/位置吗?另外,有什么我需要注意的 EF 约定吗?或者它们基本上只是用于流畅 API 映射的容器?根据我的经验,似乎 EF 一直认为它比我更聪明,并开始做我没有要求它做的事情!
    • 只是众多示例之一:stackoverflow.com/q/12762404/861716(这是一个问题,但它向您展示了它是如何工作的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多