web-dev-qa-db-ja.com

SqlException(0x80131904):無効なオブジェクト名 'dbo.Categories'

アプリケーションを実行すると、上記の例外が発生します。アプリケーションはasp.net mvc 3/C#を使用しています。 mdfファイルを作成し、それをVisual Web Developer ExpressのApp_Dataフォルダーに追加しました。接続文字列をweb.configフォルダーに追加しましたが、実行して/ storeを参照すると、上記のエラーが表示され、var categories = storeDB.Categories.ToList();行が強調表示されます。私のデータベースには6つのテーブルがあり、そのうちの1つはカテゴリです。

コントローラ:

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>
13
user522767

これは通常、単純な構成の問題を意味します。

  • おそらく本当にそのようなテーブルはありません
  • おそらくテーブルはありますが、dboスキームはありません(Fred.Categoriesにある可能性があります)
  • おそらくdbは大文字と小文字を区別し(これは問題ありません)、テーブルは実際にdbo.CATEGORIESです

これらのいずれかにより、上記の例外が発生します。特に、次のように述べています。

私のデータベースには6つのテーブルがあり、そのうちの1つはカテゴリです。

次にmachineCategory!= Categories

27
Marc Gravell

モデルビルダークラスを使用してみてください。これは、テーブルとモデルクラス間のマッピングを構成または明示的に定義する方法です。

あなたのエンティティ/コンテキストクラスでこのコードを追加してみてください

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

そのメソッド。すべての包含ステートメントを使用してください。

6
Dhananjay Singh

これは、2018年4月の例外で依然としてトップの検索ヒットであり、解決策に導いたので、特定の状況でこれを付け加えましょう...

私たちのアプリケーションはABPとABP.Zeroに基づいており、すでに Marcの答え に適合するパターンがあります。 OnModelCreatingメソッドの明示的なマッピング(la Dhananjayの答え )は完全に機能したと思いますが、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; }
    }
}
2
jdmac020

これを修正するために本当にやりたいことはあなたの中にありますContext classOnModelCreatingというメソッドが必要です...これが次のことを確認してください:

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

名前カテゴリのあるテーブル、またはテーブルという名前のSQLキーワードで実証済み、テスト済み、検証済みで、ToTableを使用して特定のテーブル名を指示します

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