レガシーデータベースと通信する必要があるEF Coreを使用するグリーンフィールドアプリケーションを作成しています。 EFはデータベース内の一部の列を無視してほしいのです。これらの列は最終的に非推奨になり、新しいエンティティモデルでは必要ないためです。レガシーシステムがまだそれらに依存しているため、まだ削除できません。
DeprecatedFeature
という不要なデータベース列の場合、次のようなことをしたいと思います。
modelBuilder.Entity<MyEntity>(entity => {
entity.HasKey(t => t.Id);
entity.ToTable("MyEntity");
entity.ColumnIgnore("DeprecatedFeature"); // <-- this is what I want to do
})
現在、私ができる最善のことは、プロパティを含め、それを廃止としてマークすることです:
public class MyEntity
{
public int Id { get; set; }
[Obsolete("Deprecated in latest version")]
public string DeprecatedFeature { get; set; }
}
しかし、それは「エラーとしての警告」をオンにできないことを意味します。データベースでまだ移行を実行する必要があります。
同様の質問: EF 4.x 、 ロード時にEF Coreの列をスキップ 、 EF Designer/EDMXを使用 および duplicate
私の回答には、私の質問にいくつかの混乱があることがわかります。
NotMapped
は、モデルにデータベースに必要のないプロパティがある場合に使用されます。私の問題はその逆です。データベースに、モデルに含めたくない列があります。
2つの選択肢があります。
NotMappedAttribute
の使用:
_public class MyEntity
{
public int Id { get; set; }
[NotMapped]
public string DeprecatedFeature { get; set; }
}
_
FluentAPIの使用:
modelBuilder.Entity<MyEntity>().Ignore(c => c.DeprecatedFeature );
エンティティクラスにそのプロパティを含めないでください。 EntityFrameworkはそれを無視する必要があります。
public class MyEntity
{
public int Id { get; set; }
// Remove this property
//public string DeprecatedFeature { get; set; }
}
データベースからこのエンティティに問題なくアクセスでき、アプリケーションコードは非推奨のプロパティにアクセスできません。このテーブルへの書き込みが必要な場合、非推奨の列はNULL可能であるか、デフォルト値を持つ必要があります。
編集:
次のようなシャドウプロパティを作成できます。
entity.Property(typeof(string), "DeprecatedFeature");
これにより、EFはプロパティを認識し(移行に含める)ことができますが、プロパティはエンティティタイプに存在する必要はありません。
両方である1つのEFデータモデルを持つことは不可能です。
あなたができることは、新しいEFデータモデルを作成することです。古いデータベースを維持するためのマイグレーションを備えた古いものと、新しいアプリケーションのためのマイグレーションなしの新しいものがあります。
新しいものでは、不要な列(プロパティ)を単にスキップできます。