web-dev-qa-db-ja.com

オブジェクトからデータベーステーブルを自動作成、Entity Framework

私はこのチュートリアルをやろうとしています http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part4-cs しかしSQL Serverのコンパクトエディションを使用する代わりに、ローカルマシンにフルインストールを使用しています。このチュートリアルの読み方では、Entity Frameworkは、定義したオブジェクトからテーブルを作成することを想定しています。私の問題は、プロジェクトを実行すると、無効なオブジェクト名dbo.movi​​esが何度も表示されることです。ようやく自分でテーブルを作成して実行できるようにしたので、接続文字列とすべてが正しいことがわかります。

私の質問は、C#で作成されたオブジェクトからテーブルを生成することは可能ですか?

12
Pieces

c#で作成されたオブジェクトからテーブルを生成することは可能ですか?

はい、可能です。コードを実行する前に、Management Studioで手動でデータベースを作成しましたか?それはあなたの問題かもしれません。 Code Firstの場合、デフォルトの規則では、データベースがまだ存在しない場合はデータベースを作成します。データベースがすでに存在する場合(テーブルがなくても)、既存のデータベースを使用します(ただし、テーブルを作成しようとはしません)。

データベースを削除してコードを再実行し、データベースが作成されるかどうかを確認するか、Global.asaxに次の行を追加します。

Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContextHere>());

実行したら、その行を次のように変更することをお勧めします。

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourDbContextHere>());

これらの名前空間はSystem.Data.Entityで定義されています

DbContextクラスは、次の便利なメソッドを定義するDatabaseプロパティも公開します。

Delete()
Create()
CreateIfNotExists()

したがって、次のようにクラスを定義した場合:

public class MyContext : DbContext {}

次のようにインスタンスを作成できます。

MyContext db = new MyContext();
db.Database.Delete();
db.Database.Create();
24
Dismissile
ModelContext.Database.EnsureCreated();
2
Ronnie

コーシャかどうかはわかりませんが、コードファーストEFを使用しているため、AddRangeを使用すると、EFは通常、定義したすべてのテーブルを作成します。アプリケーションの実行間で保持したい他のテーブルがあるため、データベースを保持したかった。 __MigrationHistoryと呼ばれるEFが作成したテーブルも削除しないと、テーブルが削除された後、テーブルが再作成されないことがわかりました。

このテーブルを削除すると、EFはデータベースを再作成することなくテーブルを再作成します。

これは本番環境ではお勧めできないアプローチかもしれませんが、私の開発ニーズではこれで問題が解決しました。多分それは誰かを助けるでしょう。

0
John

Linq-to-Sql DataContextを作成する場合、構造をデータベースに直接挿入できます。

DbDataContext db = new DbDataContext(connectionString);
db.CreateDatabase();
0
kyjan

FenixRepo ライブラリ( nuget package としても利用可能)を使用して、Contextの一部である特定のテーブルを作成できます。まず、起動時にstaticInitializeメソッドを1回呼び出す必要があります。ここで、最初の引数はファクトリメソッドで、Contextのインスタンスを返し、2番目の引数はConfigurationclassのインスタンス。 Contextに登録されているすべてのテーブルのSQLスクリプトを準備します。 ASP.NET MVCの場合、このコードをGlobal.asaxに貼り付けることをお勧めします。

FenixRepositoryScriptExtractor.Initialize(() => new Context(), new Configuration());

次に、この単純な方法で、目的のタイプのテーブルMyTableを作成できます。

var repo = new FenixRepositoryCreateTable<MyTable>();
//or repo = new FenixRepository<MyTable>();

repo.CreateTable();

また、テーブルが複数の移行にまたがっており、他のテーブルに対応するものが何もない場合、FenixAttributeを介してこれらの移行(つまり、Migrationsフォルダーからのクラスの名前)を指定でき、正確にソースとして使用されますテーブルの作成に使用されるSQLスクリプト:

[Fenix(nameof(Initial), nameof(MyTableFirstMigration), nameof(MyTableSecondMigration))]
public class MyTable
{
    //some stuff
}

この属性がない場合、ライブラリはdefaultスクリプトを使用します。常に移行を指定することをお勧めします。それ以外の場合、すべてのインデックスが作成されることが保証されないため、defaultの場合に実行されないカスタムコードを移行に含めることができるためです。 ソリューション。

ライブラリはMS SQLの場合、EF 6.1.3と互換性があり、テストされています。

0
Slava Utesinov