私のアプリケーションは、Sql CE データベースの上で Entity Framework 5.0 コード ファーストを使用しています。これまで、自動移行を使用してエンティティ マッピングの変更を管理してきました。ただし、更新中にデータが失われないように、カスタム移行を作成する必要がある変更があります。エンティティに変更を加え、Up() および Down() メソッドを生成する Add-Migration コマンドを使用しました。カスタム SQL を挿入してデータを保持するように Up() メソッドをカスタマイズし、アプリケーションをテストしました。
アプリケーションを実行すると、次のエラーが表示されました。
保留中の変更があり、自動移行が無効になっているため、現在のモデルに一致するようにデータベースを更新できません。保留中のモデルの変更をコードベースの移行に書き込むか、自動移行を有効にします。自動移行を有効にするには、DbMigrationsConfiguration.AutomaticMigrationsEnabled を true に設定します。
私の変更はすべて、実行された Up() メソッドに詳しく記述されているため、わかりません。そこで、何が起こるかを確認するためだけに、自動移行をオンに戻します。今、私はこのエラーを受け取ります:
「タイプ NTEXT または IMAGE の列は変更できません [列名 = LastName]」
このエラーは、変更に触れていないテーブル/エンティティから発生します。既存のデータベースでは、この文字列がnvarchar(4000 ) にマップされています。この例外を受け取った後に DB を調べると、列がntextに変更されていることがわかります。EFは何をしているのですか?変更されていないテーブルに触れるのはなぜですか? ここで何が起こっているかについての詳細情報を入手するにはどうすればよいですか?
更新: 回避策として、エンティティ内のすべての文字列型を次のようなデータ注釈でマークしようとしました:
[Column(TypeName = "ntext")]
public virtual string LastName
{
get;
set;
}
現在、すべての文字列がデータベースで ntext を使用しています。これにより、クエリの実行時にさらに例外が発生します。
ntext および image データ型は、WHERE、HAVING、GROUP BY、ON、または IN 句では使用できません。ただし、これらのデータ型が LIKE または IS NULL 述語と共に使用される場合を除きます。
要約すると、次のようになります。
- 自動移行をオフにすると、EF はファントム変更を検出し、例外をスローします。
- カスタム移行と組み合わせて自動移行をオンにすると、既存のすべての文字列が ntext にマップされます
- ntext にマップされた文字列はクエリできないため、アプリケーションで事実上役に立たなくなります