2012-02-10 10 views
30

主にエンティティフレームワークのコードファーストアプローチを使い始めています。主にビューに表示するために注釈でプロパティを飾ることができます(そうでなければ、エンティティフレームワークが生成したものとほぼ同じクラスを作成して、アノテーションを追加して、あるオブジェクトから次のオブジェクトにデータをコピーすることができます)。Entity Frameworkがデータベースを変更するのを停止します

今すぐアプリケーションを起動すると、データベースを作成しようとしているようです。

私はエンティティのフレームワークにしたくないいつも私のデータベースを変更します。いいえ。それも試してはいけない。データベースを変更するのは本当に難しいことではありません。私が自分でそれをしたら、もっと快適に感じるでしょう。私はデータベースを設計する際に手を握るためのフレームワークは必要ありません。

データベースの変更をやめようとフレームワークに指示することはできますか?私はデータベースを変更しようとしているという事実が恐ろしいので、コードを使うのはとても躊躇しています。開発中でさえ、私は決してそれが起こるのを見たくない。

私は不運ですか?

+1

を参照してください。あなたはあなたのデータベースのコピーを使ってそれを指し示すことができます。それを作成してdbを変更して相違を比較させ、それに応じてモデルを修正してください。 EntityTypeConfigurationジェネリッククラスも見てください。 –

+0

スキーマを変更したり、データを変更したりしますか? – jrummell

+0

私たちの一部は、これらの自動移行を信用しておらず、データベースの設計と設定は、手動で行うのは完全に合理的であるという観点から重要です。しかし、私からEDMXを離してください...これを行うもう一つの理由:あるチームはDBで作業できますが、他のチームはクラス/モデルを設定します。何か変更があった場合は、マイグレーションを検索する必要はありません。注釈などを更新するだけです。 – mmcrae

答えて

46

public class SchoolDBContext: DbContext 
{ 
    public SchoolDBContext() : base("SchoolDBConnectionString") 
    {    
     //Disable initializer 
     Database.SetInitializer<SchoolDBContext>(null); 
    } 
    public DbSet<Student> Students { get; set; } 
    public DbSet<Standard> Standards { get; set; } 
} 

は、あなたのモデルが正確にあなたのデータベースと一致していないように聞こえるhttp://www.entityframeworktutorial.net/code-first/turn-off-database-initialization-in-code-first.aspx

+1

この例のビデオのように、コンテキストクラスの静的コンストラクタに入れることができます。http://msdn.microsoft.com/en-us/data/jj572367 –

+1

ビデオには表示されません。ここで代わりに見て:http://www.entityframeworktutorial.net/code-first/turn-off-database-initialization-in-code-first.aspx 重要なのはデータベースの前でこれを使用しないでください –

+1

この回答は改善することができますこのコードを追加する場所を指定します。 –

3

EFを使用したいがデータベースを変更しない場合は、コードをまず必要としない可能性があります。おそらくデータベースのようなものが最初に必要です。回答のコメントから

http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-model-amp-database-first-walkthrough.aspx

リンク:
http://automapper.codeplex.com/
Getting Started with AutoMapper

編集:私は目標を誤解し、you should reference this answer where the following correct code was given:

If you don't want EF to create your database, you can disable the database initializer

Database.SetInitializer<MyContext>(null); 
+0

データベースが最初に*好きなように聞こえますが、私のために生成されたモデルとほぼ同じクラスを作成しなければならないという問題を回避しようとしています。ほとんど同一のクラスを作成する必要があります。そのため、ビューで表示するアノテーションをプロパティに飾ることができます(バリデーションの実施など)。それは私のすべての "EF"オブジェクトをループし、それらを注釈を運ぶ新しいオブジェクトにコピー/マップすることになります。 –

+1

私はあなたのビューにあなたのdbモデルオブジェクトを渡すべきではないと言うでしょう。一般的には、別のクラスを作成してから、そのビューで使用できるプロパティのみを含むビューに渡します。あなたはそのクラスをあなたの検証プロパティで飾るでしょう –

+0

@AnthonyShaw - 私はこれをやっている人の例はあまり見ていませんが、それはまさに私が今やっていることです。普遍的なコピー/マッピング作業のように思えたので、私はそれについて不安を感じました。ビューに表示するためにデータベースモデルオブジェクトをオブジェクトに変換するために使用するパターンはありますか?どのように通常それを行うのですか? –

2

あなたが初期化剤だ宣言し、基本クラスを使用します。

public class DatabaseInitialiser : CreateDatabaseIfNotExists<MyContext> 

いうより:

public class DatabaseInitialiser : RecreateDatabaseIfModelChanges<MyContext> 

か、使用の場合:

Database.SetInitializer<MyContext>(new RecreateDatabaseIfModelChanges<MyContext>); 

をでこれを置き換えます:

Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>); 
1

code firstあなたのご意見はかなり正確ですので、私はあなたの質問を理解していません。

EFでデータベースを操作したくない場合は、既存データベースのgenerate a modelを入力してください。あなたはEFがあなたのデータベースを作成したくない場合は、データベースの初期化を無効にすることができ

+0

そうですが、データベースからモデルを生成すると、ビューにデータを表示するために必要なデータ注釈がありません。重複した作業が多く発生します。基本的には生成されたモデルと同じクラスを作成し、その後これらのプロパティを注釈で飾ることです。私はそれに伴うすべてのコピー作業を避けようとしています。 –

+0

部分クラスまたはバディクラス(MetadataAttribute)を作成することによって、生成されたクラスをデコレートできます。 – jrummell

+0

コード2を実行したい場合、データベースは存在しますが、リレーションシップは存在しません。ビューを扱う場合、コード2のアプローチが必要です。 –

関連する問題