web-dev-qa-db-ja.com

EF Coreの移行でプロパティを維持しながら、データモデルのプロパティを無視する

レガシーデータベースと通信する必要がある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は答えではありません

NotMappedは、モデルにデータベースに必要のないプロパティがある場合に使用されます。私の問題はその逆です。データベースに、モデルに含めたくない列があります。

15
Dr Rob Lang

2つの選択肢があります。

  1. NotMappedAttributeの使用:

    _public class MyEntity
    {
         public int Id { get; set; }    
         [NotMapped]
         public string DeprecatedFeature { get; set; }
    }
    _
  2. FluentAPIの使用:

    modelBuilder.Entity<MyEntity>().Ignore(c => c.DeprecatedFeature );

14
Yared

エンティティクラスにそのプロパティを含めないでください。 EntityFrameworkはそれを無視する必要があります。

public class MyEntity 
{
    public int Id { get; set; }

    // Remove this property
    //public string DeprecatedFeature { get; set; }
}

データベースからこのエンティティに問題なくアクセスでき、アプリケーションコードは非推奨のプロパティにアクセスできません。このテーブルへの書き込みが必要な場合、非推奨の列はNULL可能であるか、デフォルト値を持つ必要があります。


編集:

次のようなシャドウプロパティを作成できます。

entity.Property(typeof(string), "DeprecatedFeature");

これにより、EFはプロパティを認識し(移行に含める)ことができますが、プロパティはエンティティタイプに存在する必要はありません。

12
Entith

両方である1つのEFデータモデルを持つことは不可能です。

  • データベースの一部のみをマップするデータモデルの新しいバージョン
  • マイグレーションを使用して、古いデータベースを維持します。

あなたができることは、新しいEFデータモデルを作成することです。古いデータベースを維持するためのマイグレーションを備えた古いものと、新しいアプリケーションのためのマイグレーションなしの新しいものがあります。

新しいものでは、不要な列(プロパティ)を単にスキップできます。

0
Jonatan Dragon