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

本文关键字:实体 映射 另一个 如果 | 更新日期: 2023-09-27 18:03:00

我正在对现有数据库进行EF Code First开发。因为我得到了一个模式,一些表名不理想,我想命名某些实体类不同于底层表,并在OnModelCreating中执行映射。

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

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

    <
  • 小部件/gh>
  • 产品

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

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

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

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

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

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

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

实体和表名是单数吗?

我问的原因是,如果你试图做类似

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

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

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

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

看起来像在不同的模式中具有相同的名称。到目前为止,在这方面还没有EF的支持。例如:

dict.Gadget
cnfg.Gadget

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