私はこのチュートリアルをやろうとしています http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part4-cs しかしSQL Serverのコンパクトエディションを使用する代わりに、ローカルマシンにフルインストールを使用しています。このチュートリアルの読み方では、Entity Frameworkは、定義したオブジェクトからテーブルを作成することを想定しています。私の問題は、プロジェクトを実行すると、無効なオブジェクト名dbo.moviesが何度も表示されることです。ようやく自分でテーブルを作成して実行できるようにしたので、接続文字列とすべてが正しいことがわかります。
私の質問は、C#で作成されたオブジェクトからテーブルを生成することは可能ですか?
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();
ModelContext.Database.EnsureCreated();
コーシャかどうかはわかりませんが、コードファーストEFを使用しているため、AddRangeを使用すると、EFは通常、定義したすべてのテーブルを作成します。アプリケーションの実行間で保持したい他のテーブルがあるため、データベースを保持したかった。 __MigrationHistoryと呼ばれるEFが作成したテーブルも削除しないと、テーブルが削除された後、テーブルが再作成されないことがわかりました。
このテーブルを削除すると、EFはデータベースを再作成することなくテーブルを再作成します。
これは本番環境ではお勧めできないアプローチかもしれませんが、私の開発ニーズではこれで問題が解決しました。多分それは誰かを助けるでしょう。
Linq-to-Sql DataContextを作成する場合、構造をデータベースに直接挿入できます。
DbDataContext db = new DbDataContext(connectionString);
db.CreateDatabase();
FenixRepo ライブラリ( nuget package としても利用可能)を使用して、Context
の一部である特定のテーブルを作成できます。まず、起動時にstatic
Initialize
メソッドを1回呼び出す必要があります。ここで、最初の引数はファクトリメソッドで、Context
のインスタンスを返し、2番目の引数はConfiguration
class
のインスタンス。 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と互換性があり、テストされています。