web-dev-qa-db-ja.com

最初のEntityFrameworkコード:クラスを無視する方法

これは質問 ここここ に似ていますが、それらは古く、良い答えがありません。

次のクラスがあるとしましょう。

class HairCutStyle { 
   public int ID { get; set; }
   public string Name { get; set; }
}

class CustomerHairCutPreference {
   public int ID { get; set; }
   public Customer Customer { get; set; }
   public HairCutStyle HairCutStyle { get; set; }
}

私のHairCutStyleデータが別のデータベースのテーブルに保存されているとしましょう(私はPaul Mitchell自身から取得しています)。 HairCutStyleクラスをPOCOクラスとして使用したい-ヘアカットスタイルを表すためにコードで使用するものですが、データベースでその情報を読み書きする必要はありません。 (他のデータベースからこれらのクラスのデータを取り込むことができる別のサービスレイヤーがあると仮定します。)

現在のdbコンテキストでHairCutStyleテーブルを作成しないようにEFに指示するにはどうすればよいですか?しかし同時に、他の場所に保存されているHairCutStyleデータへの参照である値をCustomerHairCutPreferenceテーブルに保存したいと思います。実際のデータベースFK制約によって制約されない、ある種の「仮想」外部キー。

13
Chris

確認することが3つあります。

  1. DbContextから派生したクラスでDbSet<HairCutStyle>を公開しないようにしてください
  2. HairCutStyleオーバーライドにOnModelCreatingについての言及がないことを確認してください
  3. HairCutStyle属性を使用して、NotMappedプロパティをマークします。
7

CustomerHairCutPreferenceHairCutSytleIDにプロパティを追加してから、HairCutStyleプロパティの[NotMapped]属性を使用します。ただし、HairCutStyleHairCutStyleIDの同期を維持する責任はユーザーにあることに注意してください。

class CustomerHairCutPreference {
   public int ID { get; set; }
   public Customer Customer { get; set; }
   public int HairCutStyleID {get; set; }

   [NotMapped]
   public HairCutStyle HairCutStyle { get; set; }
}

または、FluentAPIを使用して、HairCutStyleをEntityFrameworkによるマッピングから完全に除外することもできます。これは、それにリンクする複数のクラスがある場合に役立ちます。

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Ignore<HairCutStyle>();
}
23
Claies