2011-07-25 12 views
9

私はDBを作成するためにEF 4.1 CodeFirstを使用しています。 EFはクラスタード・インデックスを持つすべての主キーを作成しているようですが、これは1つのケースでは最適ではありません。 プライマリキーを非クラスタ化インデックスとしてこのテーブルを生成するようにEFに指示する方法はありますか?EF CodeFirstでクラスタ化されていない主キーインデックスを作成する

データベースが既に作成された後にカスタムスクリプトを使用して手動で行うこともできますが、このテーブルを指す外来キーがたくさんありますが、より良い、より直線的なものがあれば、 DB作成時にすでに同じことを行うための前方への方法。 助けを借りて

+2

IMOこれは、DB Firstが発明された理由です。 – Tridus

+0

@Tridus、afaikモデルファーストは「最初」でした:)もちろん、モデルの最初のものはケーキですが、コードファーストには「もっときれい/清潔」というメリットがあります。この例ではここにあります。私はそれまでのカスタマイズされたカスタマイズの欠如と呼んでいます。 – petho

+0

そうでない場合を除いてそれはより清潔です。 :)このDBのようなものの場合、Firstはデータベース側で何が必要なのかを単純に行い、EFに "そこからいくつかのPOCOを生成する"ことを伝えているので本当にうれしいです。実際に、EFやコードでは、サーバー側で使用されているインデックスの種類を知る必要はありません。 – Tridus

答えて

13

いいえSQLコードを制御する方法はありません。最初はコードであり、現行の哲学(実際には悪いものです)は、データベースについては何も知らず、気にもなりません。

この動作を変更する唯一の方法は、カスタムデータベース初期化ツールを作成し、カスタムデータベースクエリを使用して作成したインデックスを検索し、そのインデックスを削除して新しいインデックスを作成することです。いくつかの参照:

initilizerは、具体的なデータベース・サーバー製品のソリューションが依存になります。

+0

@LadislawMmka。 「初心者は、あなたのソリューションを具体的なデータベースサーバー製品に依存させるでしょう。 - これは、特定の製品用に記述した場合のみです。これを特定のプロバイダに限定する必要はありません。私はあなたが本当に意味することは、 "これはおそらく..."と思う。 –

9

はいクラスタ化インデックスを作成しないように指定する方法があります。コードの移行を使用する場合は、* .csファイルが生成され、DataBaseに移入されます。このファイルでは、クラスタ化インデックスを使用して作成する必要がある場合は、各テーブルのプライマリキーとは別に指定できます。

.PrimaryKey(t => t.MID, null, true) 
+1

これは、現在のバージョンでノンクラスタードインデックスを実現する最も簡単な方法です。コードの移行が必要です。 – jbeanky

+0

PrimaryKeyメソッドはEF 6.1にも存在しません – Triynko

+0

@triynkoテーブル作成のために生成されたコードの最初のマイグレーションクラスでCreateTableメソッドの後にチェーンされていることがわかります。このメソッドは、System.Data.Entity.Migrations.Buildersという名前空間のTableBuilderクラスにあります。 – Josh

関連する問題