4

標準の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の何にも関係しないことです(そして、コードは適切な例外をスローします-「多重度は無効です」)。私の目標を達成するために。

何かご意見は?よろしくお願いします。

4

1 に答える 1

2

Order (OrderID) の主キーには同じ名前の OrderDetails (OrderID) の外部キーがあるため、EF のルールは外部キーと主キーの関係があると正しく推測していると思います。

はい正解。ただし、重要な部分は、 sOrderへのナビゲーション コレクションがあることOrderDetailです。EF は、このプロパティ (および を参照する際に対応するナビゲーション プロパティがないという事実) から、2 つのエンティティ間に一対多の関係があるとOrderDetail推測します。Order次に、命名規則によって外部キー プロパティが推測されます。

私が言いたいのは、注文には少なくとも 1 つの OrderDetails が必要だということです。

モデルとデータベース間のマッピングでそのような制約を定義することはできません。アプリケーションのビジネス ロジックでこれを確認する必要があります。1 対多の関係では、コレクションにゼロ要素を含めることができます。

Fluent API での正しいマッピングは次のようになります。

modelBuilder.Entity<Order>()
    .HasMany(order => order.OrderDetails)
    .WithRequired()
    .HasForeignKey(orderDetail => orderDetail.RecordNumber);
于 2012-07-01T14:32:16.333 に答える