4

私は、別のクラスが関係を持つ基本クラスを継承するクラスを持っています。EFコード最初の抽象的な関係ですか?

例:

  • 基本クラス:動物
  • サブクラス1:犬
  • サブクラス2:一対多テーブル関連猫
  • :ワクチン接種
    • 犬を持つことができ複数のワクチン接種。これはリスト<ワクチン接種>として実装されています。
    • 猫は複数の予防接種を受けることができます。
    • ワクチン接種記録には1匹の動物しか付随できません。
    • ワクチン接種は、それが犬または猫に関連しているかどうかわかりません。 (犬や猫は、非衝突GUIDを使用しています。)

何の動物のテーブルがありません。動物は抽象クラスです。しかし、ワクチン接種は犬についてではなく、動物についてしか知りません。私は私のクラスライブラリを分割して、Animal and Vaccinationがコアライブラリにあり、Dogがコアライブラリを参照する別のライブラリにあるように分割しています。

Entity Framework Code Firstを使用している場合、Vaccinationsテーブルに余分な列が追加されます。Dog_ID、犬クラスのリスト<ワクチン接種>明示的宣言が推論を作成しています。そのため、この列はワクチン接種記録を犬にマッピングします。この追加の列を複数の種類のAnimalで共有したいという点を除いて、これは問題ありません。たとえば、Dog_IDとCat_IDを持っているのではなく、DogまたはCatのいずれかに参加できるAnimal_IDが必要です。

動物は抽象的でDBテーブルはないので、私はたぶん流暢なステートメントやプロパティ/属性の宣言でこれを達成できますか?

答えて

3

テーブルには、Animalテーブルを作成してそのテーブルと関係を作成しない限り、ワクチン接種された動物タイプごとに常に追加のFKカラムがあります。 EFはリレーションシップをマップしたり、高度な抽象化を行うことはできません。リレーションシップはデータベース内で直接作成する場合と同じ規則に従わなければなりません。

ワクチン接種が可能な動物は、別の表を階層に追加して、その新しい表と関連付けることができます(EFはインターフェースを操作できません)。そのためにはTable per Typeのマッピングが必要で、現在のEFバージョンではクエリのパフォーマンスが大幅に悪化します。

+0

"リレーションシップは、データベースに直接リレーションシップを作成した場合と同じ規則に従う必要があります。技術的には、1つの列を仮想外部キーとしてSQL Serverの複数のテーブルに関連付けることができます。私はEF CFでこれを行うことができることを期待していました。 –

+0

技術的には、複数の関係で1つの列を関連付けることができますが、休暇にはDog、CatなどのAnimalIdが関連付けられており、一度「親」テーブルがすべて同じIDで記録されている必要があります=犬、猫に関連しています... –

+0

私が答えで提供したTPTマッピングでリンクを確認してください。そして、動物はまだ抽象的である可能性があります。 –

2

と仮定すると、すべての動物は、その後、あなたがCatDogを継承し、Table per Typeマッピングを使用することができます予防接種

public abstract class Animal 
{ 
    public string ID { get; set; } 
    public ICollection<Vaccination> Vaccinations { get; set; } 
} 

public class Vaccination 
{ 
    public string ID { get; set; } 
    public string AnimalID { get; set; } 
    public virtual Animal Animal { get; set; } 
    //other properties 
} 

を持つことになります。

+0

ありがとうございます。これは問題ありませんが、残念なことに、わずか数種の動物だけが予防接種を受けることができます。私は、それを必要とする継承された型ではサポートしているが、基底クラスではサポートしていないというインタフェース(ICanHaveVaccinationsなど)を持っています。おそらく、予防接種でAnimalIDとAnimalを宣言することで十分でしょう...私はそれを試してみましょう。 :) –

+0

@ stimpy77は、ICanHaveVaccinationsの実装で 'Vaccinations'プロパティを宣言します。 (例:Cat、Dog) – Eranga

+0

私はすでに持っています。 –

1

私は答えとしてマークされているものを実装しました(最終的には動物のテーブルを作成する必要があります)。私の質問で説明したように、私は、犬 "と言い、これと関連する問題のために、私はherehere、およびhereに向けられています。

関連する問題