【问题标题】:\Unable to map entity to table if another entity has same name as table\如果另一个实体与表同名,则无法将实体映射到表
【发布时间】:2011-10-09 13:47:09
【问题描述】:

我正在针对现有数据库进行 EF Code First 开发。由于我收到了一个架构并且某些表名并不理想,因此我想以不同于基础表的方式命名某些实体类并在 OnModelCreating 中执行映射。

如果实体类名与现有表名冲突,这似乎不起作用,即使我在代码中重新映射它们。

给定这些(为本示例组成的)实体类:

  • 小部件
  • 小工具

我正在尝试在 OnModelCreating 中执行以下映射:

modelBuilder.Entity<Gadget>.ToTable("Sprocket");
modelBuilder.Entity<Widget>.ToTable("Gadget");

在运行时,这会产生以下错误:

System.InvalidOperationException : 实体类型 'Widget' 和 'Gadget' 不能共享表 “小工具”,因为它们不在同一类型层次结构中,或者它们之间没有有效的一对一外键关系和匹配的主键。

这没有意义,因为我正在将 Gadget 实体从 Gadget 表中映射出来,但即使我明确指定它,它似乎也会自动发生一些映射。

这种行为的解释是什么,可以解决吗?

【问题讨论】:

    标签: c# entity-framework ef-code-first


    【解决方案1】:

    您的实体和表名是单数吗?

    我问的原因是,如果你想做类似的事情

    modelBuilder.Entity<Gadget>.ToTable("Sprockets")
    modelBuilder.Entity<Widget>.ToTable("Gadgets")
    

    它可能不起作用,因为 EF:CF 按照惯例将实体映射到它们的复数表。如果您想删除此约定,只需删除 PluralizingTableNameConvention

    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    

    【讨论】:

    • 感谢您的建议,但我已经准备好那行代码。一时兴起,我尝试将其删除,结果是一样的。
    • 如果您可以控制您的实体名称,为什么不直接命名一个表名?
    • 你提出了一个很好的观点。我可以这样做,但在这一点上,我仍然想知道为什么它不起作用。
    【解决方案2】:

    看起来在不同的schema中具有相同名称的情况。到目前为止,在这方面没有对 EF 的支持。例如:

    dict.Gadget
    cnfg.Gadget
    

    请检查https://entityframework.codeplex.com/workitem/1641 并投票以提高此修复的重要性。

    【讨论】:

      【解决方案3】:

      仅供参考:上面提到的 EF WorkItem 1641 已修复在 version 6.1.2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 2019-04-19
        • 1970-01-01
        • 1970-01-01
        • 2015-08-17
        相关资源
        最近更新 更多