给定标准的 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 上的任何内容都不相关(并且代码引发了适当的异常 - “多重性无效”),我不知道如何来完成我的目标。
有什么想法吗?我提前感谢您的帮助。