20

私はMVC4アプリケーションで、エンティティフレームワーク(v 5)コードの最初の移行を行っています。データベースレベルで一意の制約を追加したいと思います。

テーブルを作成するときにこれを実行できることは知っていますが、すでにテーブルがあります。 http://msdn.microsoft.com/en-US/data/jj591621

回答回答としてマークされた次のことを試しました:EFCodeFirstとSqlCe4による一意の制約

私のデータベースコンテキストは少し異なります。接続名は次のとおりです。

public AppDatabaseContext() : base("MyConnectionDBContext")

パッケージ管理コンソールを使用してデータベースを更新すると、オーバーライドされたシードメソッドが呼び出されません。

protected override void Seed(AppDatabaseContext context)

私も次のことを試しました:http://romiller.com/2010/07/31/ef-ctp4-tips-tricks-running-additional-ddl/

ネストされたクラスを使用しませんでした。これは、app.configを介して初期化子を登録する必要があるように見えたためです。コードで初期化しているときに動作させることができませんでした。InitializeDatabaseが呼び出されますが、次の条件が真になることはありません。

(!context.Database.Exists() || !context.Database.ModelMatchesDatabase())

これは、移行が実行された後に発生するためです...

また、これを1つの段階で試しました。エンティティフレームワークコードの一意の制約最初に、これは以前と同じ問題であり、この条件がtrueを返すことはありませんでした。

理想的には、移行ファイルにいくつかの標準SQLを含めたいと思います。それを行う方法はありますか?そうでない場合、コードファーストマイグレーションを使用してこれを達成する方法はどこで確認できますか?

ありがとう!

アップデート:

SQL関数が使えない理由はありますか?

 public override void Up()
 {
        AddColumn("Posts", "Abstract", c => c.String());

        Sql("UPDATE Posts SET Abstract = LEFT(Content, 100) WHERE Abstract IS NULL");
 }

明らかに正しいSQLを使用しています...

4

3 に答える 3

33

コードファーストマイグレーションでは、これをUp()メソッドで使用して、単一の列に一意のインデックスを追加しました。

CreateIndex(table: "Organisations", 
            column: "Name", 
            unique: true, // unique index
            name: "MyIndex");

...そしてDown()メソッドで:

DropIndex(table: "Organisations", 
          name: "MyIndex");

それはあなたが求めているものですか?

于 2012-12-26T19:03:20.543 に答える
9

EF 6.1以降、モデルで次のいずれかを使用してこれを実行できるようになりました

属性

 [Index("IX_UniqueName", IsUnique = true)]
 public string Name {get;set;}

または流暢

Property(s => s.Name).HasColumnAnnotation(IndexAnnotation.AnnotationName,
    new IndexAnnotation(
        new IndexAttribute("IX_UniqueName") { IsUnique = true }));

流暢な方法は、そのクレイジーな冗長IMOとしては完璧ではありませんが、少なくとも今は可能です。

ArthurVickersブログのその他のディートhttp://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/

于 2015-03-27T03:45:14.427 に答える
6

Add-Migrationパッケージマネージャーコンソールからのコマンドを使用して、新しい移行をスキャフォールディングすることができます。空の移行が作成されると、メソッドで、クラスUpのメソッドを使用して新しいインデックスを作成できます。次のようになります。CreateIndexDbMigration

CreateIndex("dbo.Accounts", "AccessKey", unique: true);

于 2013-01-16T21:39:12.950 に答える