实体框架正在追加" 1"表名和查询失败

时间:2017-04-06 20:29:38

标签: entity-framework asp.net-web-api2

我们有一个使用Web Api和Entity Framework的电子商务网站。我最近为一个名为" BundleProduct"的实体创建了一个ApiController。当我在控制器上调用GET方法时,我得到一个System.Data.SqlClient.SqlException:"无效的对象名称' dbo.BundleProducts1'。"

使用VS调试器,这是正在执行的查询(此表中只有两列,一起形成主键):

SELECT 
[Extent1].[Fk_BundleID] AS [Fk_BundleID], 
[Extent1].[Fk_ProductID] AS [Fk_ProductID]
FROM [dbo].[BundleProducts1] AS [Extent1]

没有" BundleProducts1"表,它应该被称为" BundleProducts"。我在代码中搜索了一下,找不到任何名称" BundleProducts1"使用。

BundleProducts表表示" Bundles"之间的多对多关系。表和"产品"表。此特定表只有两列,两者都是主键。我确实看过DbContext类,它对BundleProducts的唯一引用是:

public DbSet<BundleProduct> BundleProducts { get; set; }

modelBuilder.Entity<Bundle>()
.HasMany(e => e.Products)
.WithMany(e => e.Bundles)
.Map(m => m.ToTable("BundleProducts")
.MapLeftKey("Fk_BundleID")
.MapRightKey("Fk_ProductID"));

为什么EF附加&#34; 1&#34;到表名,我该怎么做才能改变它?

1 个答案:

答案 0 :(得分:5)

当您使用多对多映射(HasMany - WithMany)时,EF将使用名为BundleProducts隐藏关联类。

问题是您还添加了可见BundleProducts。 EF尝试按照您的指示执行操作:将两个类映射到表,然后遇到名称冲突。可见类是受害者并被重命名。

您必须从模型中删除可见类,或者将多对多映射转换为两个一对多映射,中间为BundleProductsBundle 1 - n BundleProduct n - Product