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

Kev*_*ger 6 c# entity-framework ef-code-first

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

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

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

  • 窗口小部件
  • 小工具

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

modelBuilder.Entity<Gadget>.ToTable("Sprocket");
modelBuilder.Entity<Widget>.ToTable("Gadget");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ale*_*lec 2

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

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

modelBuilder.Entity<Gadget>.ToTable("Sprockets")
modelBuilder.Entity<Widget>.ToTable("Gadgets")
Run Code Online (Sandbox Code Playgroud)

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

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
Run Code Online (Sandbox Code Playgroud)

  • 你提出了一个很好的观点。我可以做到这一点,但此时,我仍然有兴趣知道为什么它不起作用。 (2认同)