【问题标题】:Code first table name error when many to many table insert插入多对多表时代码第一个表名错误
【发布时间】: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&lt;PluralizingTableNameConvention&gt;(); }
  • 我试过这个,但是当项目启动时发生错误: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


【解决方案1】:

我无法解决这个问题。所以我创建了两个一对多的映射来插入到 FoodMenu 表中。一份用于食物,一份用于菜单。解决了我的问题,我现在可以插入了。我在get过程中也没有任何问题。

我的美食菜单class;

public class FoodMenu: AuditableEntity, IBaseDomain

    {
        public int FoodID { get; set; }

        public int MenuID { get; set; }

        //------------------------------------------------

        public Food food { get; set; }

        public Menu menu { get; set; }
    }

和下面的映射;

public FoodMenuMap()
        {
            ToTable("FoodMenu");

            Property(x => x.FoodID)
                .HasColumnName("FoodID")
                ;

            Property(x => x.MenuID)
                .HasColumnName("MenuID")
                ;

            //One to Many FluentApi

            HasRequired<Food>(s => s.food)
            .WithMany(g => g.foodFoodMenus)
            .HasForeignKey<int>(s => s.FoodID);

            HasRequired<Menu>(s => s.menu)
            .WithMany(g => g.menuFoodMenus)
            .HasForeignKey<int>(s => s.MenuID);

        }

Food 和 Menu 类的导航属性;

食物:
public List&lt;FoodMenu&gt; foodFoodMenus { get; set; }

菜单:
public List&lt;FoodMenu&gt; menuFoodMenus { get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多