【问题标题】:SqlException (0x80131904): Invalid object name 'dbo.Categories'SqlException (0x80131904): 无效的对象名称 'dbo.Categories'
【发布时间】:2011-03-21 06:27:08
【问题描述】:

我在运行应用程序时遇到上述异常。该应用程序使用 asp.net mvc 3 / C#。我制作了一个 mdf 文件并将其添加到 Visual Web Developer Express 的 App_Data 文件夹下。我在 web.config 文件夹中添加了连接字符串,但是当我运行并浏览到 /store 时,我得到了上面的错误,并突出显示了 var categories = storeDB.Categories.ToList(); 行。我的数据库包含 6 个表,其中一个是 Category。

控制器:

EventCalendarEntities storeDB = new EventCalendarEntities();

public ActionResult Index()  
{  
    var categories = storeDB.Category.ToList();  
    return View(categories);  
}    

web.config 文件中的连接字符串:

<connectionStrings>
   <add name="EventCalendarEntities"
        connectionString="data source=.\SQLEXPRESS;
        Integrated Security=SSPI;
        AttachDBFilename=|DataDirectory|\MvcEventCalendar.mdf;
        User Instance=true"
        providerName="System.Data.SqlClient" />
</connectionStrings>

【问题讨论】:

  • 确定你有分类表吗?

标签: c# sql-server asp.net-mvc entity-framework asp.net-mvc-3


【解决方案1】:

这通常意味着一个简单的配置问题:

  • 也许真的没有这样的桌子
  • 可能表在那里,但没有dbo 方案(可能在Fred.Categories 中)
  • 也许数据库是区分大小写的(这很好),而表实际上是dbo.CATEGORIES

其中任何一个都会导致上述异常。您特别指出:

我的数据库包含 6 个表,其中一个是 Category。

现在到机器Category != Categories

【讨论】:

  • 我没有任何名为 Categories 的表。我有一个名为 Category 的表。
  • @user522767 那么你可能想告诉实体框架,它仍在寻找类别。
  • 公共类 EventCalendarEntities : DbContext { public DbSet Events { get;放; } 公共 DbSet 类别 { 获取;放; } }
  • @user522767 这是使用代码优先吗?您仍然需要告诉它如何将该类映射到表...
  • 终于找到了“无效的对象名称dbo.Categories”问题的修复。我不得不将所有表名和 DbSet 属性更改为复数。例如。类别到类别,DbSet 类别到 DbSet 类别。在控制器中,我使用了一个实体对象 StoreDB,例如 StoreDB.Categories.ToList()。感谢您的帮助。
【解决方案2】:

尝试使用模型构建器类。这是配置或显式定义表和模型类之间映射的方式。

在您的实体/上下文类中尝试添加此代码

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
       base.OnModelCreating(modelBuilder);
       modelBuilder.Entity<Category>().ToTable("Category");
    }

它是一种方法。确保你使用所有包含语句。

【讨论】:

    【解决方案3】:

    由于这仍然是 2018 年 4 月异常中的热门搜索,它引导我找到了解决方案,让我针对特定情况添加它...

    我们的应用程序基于 ABP 和 ABP.Zero,并且我们已经有了适合 Marc's answer 的模式。虽然我敢打赌 OnModelCreating 方法中的显式映射(例如 Dhananjay's answer)会完美运行,但到目前为止,ABP 的映射似乎运行良好,我不想打破这种模式。

    我的解决方案是在实体类中添加一个表属性,这解决了 EF 的困惑。

    using System;
    using Abp.Domain.Entities;
    using System.ComponentModel.DataAnnotations.Schema;
    
    namespace Discovery.History
    {
    
        [Table("HistoryRecords")]
        public class HistoryRecord : Entity<int>
        {
            public int ResearcherCount { get; set; }
            public DateTime DateSubmitted { get; set; }
            public string Comments { get; set; }
        }
    }
    

    【讨论】:

      【解决方案4】:

      你真正想要做的是解决这个问题Context class,你应该有一个名为OnModelCreating的方法...确保它有这个:

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
          modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
      }
      

      【讨论】:

        【解决方案5】:

        经过验证、测试和验证的表名称类别或任何名为表的 SQL 关键字使用 ToTable 来指示特定表名称

         protected override void OnModelCreating(DbModelBuilder modelBuilder)
         {
             modelBuilder.Entity<category>().ToTable("category");
         }
        

        【讨论】:

          【解决方案6】:

          如果您有一个没有this.Map.(a table in db necessary to mapping) 的用于映射属性和键的类,EntityFramework 期望您有一个名为 Category 但转换为复数形式的表,因此“Categories”.. 要解决此问题,您可以添加 this.Map(in correct table existing in your DB)

          【讨论】:

            【解决方案7】:

            在您创建 DbSet 的 DbContext 中,将类别更改为类别 我通过这种方式解决了同样的问题

            【讨论】:

            • Please don't post screenshots of text。它们无法被屏幕阅读器等自适应技术的用户搜索或复制,甚至无法使用。相反,将代码作为文本直接粘贴到您的问题中。如果选择它并单击{} 按钮或Ctrl+K,则代码块将缩进四个空格,这将导致其呈现为代码。见How to Answer
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-14
            • 2021-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多