これが私の問題の簡略版です。調査アプリケーションを考えてみましょう:
- 質問がありますが、
- 質問には多くのオプションがあり、オプションは質問にのみ属することができます
- 質問には 1 つのカテゴリが必要です。カテゴリは多くの質問に属することができます
- 質問には多くのタグを付けることができ、タグは多くの質問に属することができます
さらに、質問と他の質問のオプションとの間の依存関係を定義したいと思います。たとえば、ユーザーが「車を持っていますか?」に対して「いいえ」のオプションに投票した場合などです。「あなたの車のブランドは何ですか?」と聞かれることはありません。
Code First によって作成された自動生成データベース スキーマとデータベース ファーストによって作成された自動生成コードの両方が満足できるものではありません。以下は、両方の方法で生成されたコードと db スキーマです。
EFは質問とタグの関係を期待どおりに処理できますが、質問にはすでに独自のオプションがあるため、質問とオプションの間の依存関係を処理できません(私が理解したように)。
EF に関して言えば、この場合の理想的なコード/データベース設計は何でしょうか?
コードファースト - コード
public class Question
{
public long Id { get; set; }
public string Text { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
public virtual ICollection<Option> Options { get; set; }
public virtual ICollection<Option> DependencyOptions { get; set; }
[ForeignKey("CategoryId")]
public virtual Category Category { get; set; }
public long CategoryId { get; set; }
}
public class Option
{
public long Id { get; set; }
public string Text { get; set; }
public virtual ICollection<Question> DependencyQuestions { get; set; }
[ForeignKey("QuestionId")]
public virtual Question Question { get; set; }
public long QuestionId { get; set; }
}
public class Tag
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Question> Questions { get; set; }
}
public class Category
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Question> Questions { get; set; }
}
Code First - テーブル
データベースファースト - テーブル
データベースファースト - コード
public class Question
{
public long Id { get; set; }
public string Text { get; set; }
public long CategoryId { get; set; }
public virtual Category Category { get; set; }
public virtual ICollection<Option> Options { get; set; }
public virtual ICollection<Option> Options1 { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
public class Option
{
public long Id { get; set; }
public string Text { get; set; }
public long QuestionId { get; set; }
public virtual Question Question { get; set; }
public virtual ICollection<Question> Questions { get; set; }
}
public class Tag
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Question> Questions { get; set; }
}
public class Category
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Question> Questions { get; set; }
}