【发布时间】: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