如果另一个实体与表具有相同的名称,则无法将实体映射到表

6
我正在使用EF Code First对现有数据库进行开发。由于我手头上有一个模式,其中一些表名不太理想,因此我想将某些实体类的名称命名为与底层表不同,并在OnModelCreating中执行映射。
如果实体类名与现有表名冲突,即使我在代码中重新映射它们,也似乎无法正常工作。
给定以下(为此示例而虚构的)实体类:
小部件
小玩意儿
我试图在OnModelCreating中执行以下映射:
modelBuilder.Entity<Gadget>.ToTable("Sprocket");
modelBuilder.Entity<Widget>.ToTable("Gadget");

在运行时,会产生以下错误:
System.InvalidOperationException:由于实体类型“Widget”和“Gadget”不在同一类型层次结构中,或者它们之间没有有效的一对一外键关系来匹配它们的主键,因此它们不能共享表“Gadget”。
这是不合理的,因为我正在将Gadget实体映射到Gadget表,但似乎某些映射是自动发生的,即使我明确指定了它。
这种行为的解释是什么,如何解决?
3个回答

2

你的实体和表名是单数形式吗?

我这么问是因为如果你想做像下面这样的事情:

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

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

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

谢谢建议,但我已经放置了那行代码。出于一时的冲动,我尝试将其删除,结果仍然相同。 - Kevin Krueger
如果您可以控制实体名称,为什么不直接避免使用表名作为实体名称呢? - Alec
2
你提出了一个很好的观点。我可以这样做,但是目前来说,我仍然很想知道为什么它不起作用。 - Kevin Krueger

1
FYI: 上述的EF WorkItem 1641已在版本6.1.2上修复。

0

看起来这种情况是在不同的模式中具有相同的名称。截至当前日期,EF 不支持此方面。例如:

dict.Gadget
cnfg.Gadget

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接