Entity Framework 例外: 無効なオブジェクト名 質問する

Entity Framework 例外: 無効なオブジェクト名 質問する

Code First アプローチを使用してデータベースを作成しようとしています。次のコードを実行すると、次の例外が発生します。定義したフィールドに何か問題がありますか? これを解決するにはどうすればよいでしょうか?

例外:

エントリの更新中にエラーが発生しました。詳細については内部例外を参照してください。

内部例外:

「オブジェクト名 'dbo.Dinners' が無効です。

注記: データベースにそのようなテーブル(Dinners)はありません。コードはテーブルを作成するはずです。私は、サーバーを識別するための接続文字列を指定しました。EF Code First: SQL Server に接続できません接続文字列を変更する必要がありますか?

接続文字列:

string connectionstring = "データ ソース=.;初期カタログ=LibraryReservationSystem;統合セキュリティ=True;接続タイムアウト=30";

LibraryReservationSystem データベースは既に存在するデータベースです。テーブルがありません。EF がテーブルを作成することを期待しています。

動作中の LINQ 2 SQL アプリケーションからコピーした接続文字列。EF に提供するために変更を加える必要はありますか?

ここに画像の説明を入力してください

アップデート

次のコードを追加すると、例外が変更されました。 「無効なオブジェクト名 'dbo.Dinner'」と表示されます。 Dinners テーブルではなく、Dinner テーブルについてエラーが発生しています。

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

オリジナルコード

    static void Main(string[] args)
    {

        string connectionstring = "Data Source=.;Initial Catalog=LibraryReservationSystem;Integrated Security=True;Connect Timeout=30";

        using (var db = new NerdDinners(connectionstring))
        {
            var product = new Dinner { DinnerID = 1, Title = 101 };
            db.Dinners.Add(product);
            int recordsAffected = db.SaveChanges();
        }

    }


using System.Data.Entity;
namespace LijosEF
{
public class Dinner
{
    public int DinnerID { get; set; }
    public int Title { get; set; }

}

public class RSVP
{
    public int RSVPID { get; set; }
    public int DinnerID { get; set; }

    public virtual Dinner Dinner { get; set; }
}

//System.Data.Entity.DbContext is from EntityFramework.dll
public class NerdDinners : System.Data.Entity.DbContext
{

    public NerdDinners(string connString): base(connString)
    { 

    }

    public DbSet<Dinner> Dinners { get; set; }
    public DbSet<RSVP> RSVPs { get; set; }
}
}

参照

  1. http://nerddinner.codeplex.com/discussions/358197
  2. エンティティ フレームワーク - 無効なオブジェクト名
  3. 生成されたテーブルからデータを取得するときに、オブジェクト名 'dbo.TableName' が無効です
  4. 参考文献

ベストアンサー1

LibraryReservationSystem データベースは既に存在するデータベースです。テーブルがありません。EF がテーブルを作成することを期待しています。

それは正しくありません。データベースが存在する場合、EF はこのデータベースにテーブルを作成しません。EF は、データベースが存在しない場合は作成できます。これは、CreateDatabaseIfNotExists明示的に変更しない場合に適用されるデフォルトのデータベース初期化子です。DropCreateDatabaseAlwaysまたは という2 つの他の初期化子を選択できますDropCreateDatabaseIfModelChanges。ただし、どちらも既存のデータベースにテーブルを作成するだけでなく、データベースを完全に削除し、すべてのテーブルを含む最初からデータベースを作成します。

何ができるか:

  • データベースを手動で削除するか(SSMSなど)、EFはテーブルを含む新しいデータベースを作成します。
  • またはDropCreateDatabaseAlways初期化子を使用する一度EFにテーブルを含むデータベースを作成させ、その後初期化子を再度削除します。
  • あるいは、何らかの理由でデータベースを削除できない場合は、 Seed データベースにテーブルを追加するメソッド に SQL コードを記述します(間違いです。Mark Stafford のコメントに感謝します)
  • またはコードファースト移行(EF >= 4.3) 新しいエンティティを追加したときに、既存のデータベースに新しいテーブルを追加します。

おすすめ記事