【发布时间】:2019-07-07 12:08:45
【问题描述】:
昨天我问了一个问题,后来我说解决了这个问题。但是今天又发生了同样的错误。
我有三个表 dbo.Food、dbo.Menu 和 dbo.FoodMenu 这是多对多链接表 - 像这样:
- dbo.Food { ID, FoodName }
- dbo.Menu { ID, MenuName }
- dbo.FoodMenu { FoodID, MenuID }
我想将 Food id 和 Menu id 插入到 FoodMenu 表中。我的上下文没问题,我的映射没问题,代码和Exception 下面。请帮忙。
public JsonResult FoodMenu(FoodMenuViewModel vm)
{
if (ModelState.IsValid)
{
ManyDbContext ctx = new ManyDbContext();
foreach (var item in vm.MenuIds)
{
ctx.FoodMenus.Add(new FoodMenu { FoodID = vm.FoodId, MenuID = item });
ctx.SaveChanges();
}
return Json(new { Result = true, Mesaj = "" });
}
else
{
return Json(new { Result = false, Mesaj = "" });
}
}
例外:
System.Data.Entity.Infrastructure.DbUpdateException: '更新条目时出错。有关详细信息,请参阅内部异常。'
SqlException:无效的对象名称“dbo.FoodMenus”。
上下文:
public DbSet<Food> Foods { get; set; }
public DbSet<Menu> Menus { get; set; }
public DbSet<FoodMenu> FoodMenus { get; set; }
映射:
modelBuilder.Entity<Food>()
.HasMany<Menu>(s => s.menus)
.WithMany(c => c.foods)
.Map(cs =>
{
cs.MapLeftKey("FoodID");
cs.MapRightKey("MenuID");
cs.ToTable("FoodMenu");
});
我从这个错误中了解到:我的表名是dbo.FoodMenu,但异常说:它必须是dbo.FoodMenus。但我不知道为什么。
这是我的 FoodMenu class ;
public class FoodMenu
{
[Key, Column(Order = 0)]
public int FoodID { get; set; }
[Key, Column(Order = 1)]
public int MenuID { get; set; }
}
【问题讨论】:
-
你可以试试这个选项:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } -
我试过这个,但是当项目启动时发生错误:FoodMenu1: Name: The EntitySet 'FoodMenu1' with schema 'dbo' and table 'FoodMenu' is already defined。每个 EntitySet 必须引用一个唯一的模式和表。 '
-
我再次看到这个问题,现在想问我之前问的问题,db 模型是如何生成的?,异常说你没有表 FoodMenus。我还希望您在尝试插入食物时遇到该异常,因为上下文中显示的是 Foods
-
插入 Food 表没有异常,因为 Foods 是一个变量,而不是类名。 db 模型生成不是问题,除了 FoodMenu 表。我想提供新信息:当我得到这个异常时,我试图从数据库中更改 FoodMenu 的表名。新表名是异常想要的 FoodMenus,然后单击继续按钮。当我再次运行相同的进程时,插入进程成功。所以我认为解决了问题,但是当我重新启动时,自然发生了另一个异常。
-
@ibrahimgenc 你可以发布 FoodMenu 课程来提问
标签: sql-server asp.net-mvc entity-framework insert many-to-many