わかった。
バックグラウンド。
私は当初、次の行に沿って EF モデルを作成しようとしていました。
public class Person
{
[Key]
public Guid ID { get; set; }
public string Name { get; set; }
public Guid PhoneID { get; set; }
public virtual ICollection<Phone> Phones { get; set; }
}
public class Org
{
[Key]
public Guid ID { get; set; }
public string Name { get; set; }
public Guid PhoneID { get; set; }
public virtual ICollection<Phone> Phones { get; set; }
}
public class Phone
{
[Key]
public Guid ID { get; set; }
public string Number { get; set; }
public Guid EntityID { get; set; }
[ForeignKey("EntityID")]
public virtual User User { get; set; }
[ForeignKey("EntityID")]
public virtual Org Org { get; set; }
}
しかし、これが SQL Server の外部キー関係の整合性に問題を引き起こすことを (ほとんど) 認識しています。これを修正するために、Phone クラスを次のように変更しました。
public class Phone
{
[Key]
public Guid ID { get; set; }
public string Number { get; set; }
public Guid? PersonID { get; set; }
public Guid? OrgID { get; set; }
[ForeignKey("PersonID")]
public virtual User User { get; set; }
[ForeignKey("OrgID")]
public virtual Org Org { get; set; }
}
質問。
モデルビルダー/Fluent API を使用してルールを適用/マッピングし、Phone オブジェクトが PersonID または OrgID を持つようにするにはどうすればよいですか?
編集:
これにより、SQL Server でデータベースを設計していた場合には作成できないデータ整合性規則が作成されていることは認識していますが、EF には、データベース設計を次のレベルに引き上げる潜在的な柔軟性があるように思えます。
私は EF (特に Code-First) を Microsoft のソフトウェア開発戦略における次の大きな飛躍と考えています。私見ですが、これは .Net の導入と同じくらい大きな飛躍です (ここで、データベース設計をデータベース自体から遠ざけ、マネージ コードに統合することで、いくつかの議論が生じるはずです!)。