\如果另一个实体与表同名,则无法将实体映射到表

时间:2011-07-20 16:41:32

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

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

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

鉴于这些(由此示例构成)实体类:

  • 小工具
  • 小工具

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

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

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

  

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

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

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

3 个答案:

答案 0 :(得分:2)

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

我问的原因是,如果你想做一些像

这样的事情
modelBuilder.Entity<Gadget>.ToTable("Sprockets")
modelBuilder.Entity<Widget>.ToTable("Gadgets")

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

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

答案 1 :(得分:1)

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

答案 2 :(得分:0)

表格在不同的架构中具有相同名称时的情况。直到当前日期,在这方面都没有EF的支持。 E.g:

dict.Gadget
cnfg.Gadget

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