これは質問 ここ と ここ に似ていますが、それらは古く、良い答えがありません。
次のクラスがあるとしましょう。
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制約によって制約されない、ある種の「仮想」外部キー。
確認することが3つあります。
DbContext
から派生したクラスでDbSet<HairCutStyle>
を公開しないようにしてくださいHairCutStyle
オーバーライドにOnModelCreating
についての言及がないことを確認してくださいHairCutStyle
属性を使用して、NotMapped
プロパティをマークします。CustomerHairCutPreference
のHairCutSytleID
にプロパティを追加してから、HairCutStyle
プロパティの[NotMapped]
属性を使用します。ただし、HairCutStyle
とHairCutStyleID
の同期を維持する責任はユーザーにあることに注意してください。
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>();
}