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
LibraryReservationSystem データベースは既に存在するデータベースです。テーブルがありません。EF がテーブルを作成することを期待しています。
それは正しくありません。データベースが存在する場合、EF はこのデータベースにテーブルを作成しません。EF は、データベースが存在しない場合は作成できます。これは、CreateDatabaseIfNotExists
明示的に変更しない場合に適用されるデフォルトのデータベース初期化子です。DropCreateDatabaseAlways
または という2 つの他の初期化子を選択できますDropCreateDatabaseIfModelChanges
。ただし、どちらも既存のデータベースにテーブルを作成するだけでなく、データベースを完全に削除し、すべてのテーブルを含む最初からデータベースを作成します。
何ができるか:
- データベースを手動で削除するか(SSMSなど)、EFはテーブルを含む新しいデータベースを作成します。
- または
DropCreateDatabaseAlways
初期化子を使用する一度EFにテーブルを含むデータベースを作成させ、その後初期化子を再度削除します。 -
あるいは、何らかの理由でデータベースを削除できない場合は、に SQL コードを記述します(間違いです。Mark Stafford のコメントに感謝します)Seed
データベースにテーブルを追加するメソッド - またはコードファースト移行(EF >= 4.3) 新しいエンティティを追加したときに、既存のデータベースに新しいテーブルを追加します。