【问题标题】:One to Many in Code First Entity Framework model - How do the relationships work?Code First Entity Framework 模型中的一对多 - 关系如何工作?
【发布时间】:2012-06-29 14:21:49
【问题描述】:

鉴于标准的 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 的规则正确猜测它们具有外键/主键关系。

对吗?

第二部分是另一个问题:

我有一个现有数据库,其中外键名称不同(例如,将 OrderDetail 中的 OrderId 更改为 RecordNumber -(我无法更改数据库))。在这种情况下,我正在努力理解如何关联这两个表。

我使用的是 Fluent API(而不是上面的注释)并且有这样的东西:

---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。

都不行。

我想表达的想法是,一个订单必须至少有一个 OrderDetails - 我试图能够这样导航:

   Con.Orders.Single(o => o.OrderId == 1).OrderDetails

我遇到的问题是我用 HasForeignKey(...) 声明的外键与 Orders 上的任何内容都没有关系(并且代码引发了适当的异常 - “多重性无效”),我就离开了不知道如何实现我的目标。

有什么想法吗?提前感谢您的帮助。

【问题讨论】:

    标签: entity-framework code-first


    【解决方案1】:

    我猜是因为 Order (OrderID) 中的主键有 OrderDetails (OrderID) 中的外键名称相同,EF 的 规则正确猜测他们有一个外键/主键 关系。

    是的,正确。但重要的部分是Order 有一个导航集合到OrderDetails。 EF 从这个属性(以及在 OrderDetail 中没有对应的导航属性引用 Order 的事实)推断出两个实体之间存在一对多的关系。然后通过命名约定推断外键属性。

    我试图表达的想法是订单必须至少有 一个订单详情。

    您不能在模型和数据库之间的映射中定义这样的约束。您必须在应用程序的业务逻辑中确保这一点。在一对多关系中,集合可以有零个元素。

    使用 Fluent API 的正确映射是:

    modelBuilder.Entity<Order>()
        .HasMany(order => order.OrderDetails)
        .WithRequired()
        .HasForeignKey(orderDetail => orderDetail.RecordNumber);
    

    【讨论】:

    • 好的。这很好,这是正确的答案。谢谢你。我可以看到我走在正确的轨道上,但是在某些概念上有些困难。如果我正在阅读映射,我们所说的是:订单有零个或多个 OrderDetails;并且 OrderDetail 需要一个 Order - 但没有从 OrderDetail 导航回订单;我感到困惑的地方是 HasForeignKey - 看起来我完全没有意识到 WithRequired() 返回一个 OrderDetail 的 DependentNavigationPropertyConfiguration,它有一个外键......
    • 我需要更多地研究这个并更加熟悉 Has... 和 With... 方法。有什么提示可以让我从这里继续前进吗?再次感谢。
    • @AlanMoffet:Mortezza Manavi 的博客对关系映射进行了很好的介绍:weblogs.asp.net/manavi/archive/2011/03/27/…(...以及以下第 2 到第 6 部分)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多