標準のNorthwindデータベース(簡潔にするために縮小)を考えると、次のようになります。
[Table("Order Details")]
public class OrderDetail : IValidatableObject
{
[Key, Column(Order = 1)]
public int OrderID { get; set; }
[Key, Column(Order = 2)]
public int ProductID { get; set; }
...
}
[Table("Orders")]
public class Order
{
public int OrderID { get; set; }
...
public virtual ICollection<OrderDetail> OrderDetails { get; set; }
}
これが正確にどのように機能するのか疑問に思っています。Order(OrderID)の主キーには同じ名前のOrderDetails(OrderID)の外部キーがあるため、EFのルールでは、外部キーと主キーの関係があると正しく推測されます。
あれは正しいですか?
パート2は別の質問です:
外部キーの名前が同じではない既存のデータベースがあります(たとえば、OrderDetailのOrderIdをRecordNumberに変更します-(データベースを変更できません))。この場合、2つのテーブルを関連付ける方法を理解しようと苦労しています。
私はFluentAPIを使用しており(上記のようなアノテーションではありません)、次のようなものがあります。
---OrderDetails
// set up the primary key
HasKey(t => new { t.RecordNumber, t.ProductID };
---Order
HasKey(t => t.OrderId);
HasRequired(t => t.OrderDetails).WithMany().HasForeignKey(t => t.OrderId)
(最後のステートメントは、HasForeignKey(...)が関連付けることができると思われる唯一のものが、宣言されたプライマリ複合キーであるという点で、信じられないほど間違っているようです)
私も試しました
HasMany((t => t.OrderDetails).WithMany()
これは、OrderDetailsを持たないようにするという点で、前のステートメントとは異なるように見えます。
どちらも機能しません。
私が表現しようとしている考えは、注文には少なくとも1つのOrderDetailsが必要であるということです。そして、このようにナビゲートできるようにしようとしています。
Con.Orders.Single(o => o.OrderId == 1).OrderDetails
私が抱えている問題は、HasForeignKey(...)で宣言した外部キーが、Ordersの何にも関係しないことです(そして、コードは適切な例外をスローします-「多重度は無効です」)。私の目標を達成するために。
何かご意見は?よろしくお願いします。