EntityFramework 6使用错误的列作为父ID
本文关键字:ID 错误 EntityFramework | 更新日期: 2023-09-27 18:23:44
我正在处理实体框架6中的一段代码,其中一条记录有子记录。
然而,我遇到的问题是,当EF生成SQL来选择子记录时,它在子模型中选择了错误的列来关闭。
示例代码(为简洁起见,截取了一些属性):
[Table("OrderTracking")]
public class OrderTrackingEntity
{
[Key]
public int ID { get; set; }
public int? OrderEntryID { get; set; }
public string PONumber { get; set; }
public string OrderType { get; set; }
public int? CustomerID { get; set; }
public int? ManufacturerID { get; set; }
public string Name { get; set; }
public string Address1 { get; set; }
public virtual ICollection<OrderTrackingDetailEntity> Items { get; set; }
}
[Table("OrderTrackingDetails")]
public class OrderTrackingDetailEntity
{
// I want to key off of this field, OrderTrackingID == OrderTrackingEntity.ID
[Key, Column(Order = 0)]
public int OrderTrackingID { get; set; }
// EF Keeps on selecting this field
[Key, Column(Order = 1)]
public int ID { get; set; }
public string LineNumber { get; set; }
public decimal? UnitPrice { get; set; }
public int Quantity { get; set; }
}
输出SQL如下:
SELECT
[Extent1].[OrderTrackingID] AS [OrderTrackingID],
[Extent1].[ID] AS [ID],
[Extent1].[LineNumber] AS [LineNumber],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[Quantity] AS [Quantity],
FROM [dbo].[OrderTrackingDetails] AS [Extent1]
WHERE [Extent1].[ID] = @EntityKeyValue1 -- << WRONG FIELD
如何使用OrderTrackingDetailEntity.OrderTrackingID作为要关闭的id?(最好使用属性)
首先,您的子实体上没有导航属性。现在EF应该选择合适的资产。然而,我更喜欢明确地处理这些事情,所以我也会添加一个ForeignKey
属性:
[ForeignKey("OrderTrackingID")]
public virtual OrderTrackingEntity OrderTracking { get; set; }
您可以像这样在DbContext中进行配置,但它也需要从OrderTrackingID属性中删除[Key]attrobute:
modelBuilder.Entity<OrderTrackingEntity>().HasMany(x => x.OrderTrackingDetailEntity).WithRequired().HasForeignKey(x=>x.OrderTrackingID );
因为在我看来,您的OrderTrackingID属性不是真正的密钥,而是外键。
还要考虑引用真实的实体,而不是只保留关系的密钥。
你可以更新你的OrderTrackingDetailEntity来引用OrderTrackingEntity,而不是只有一个密钥,它会很好地映射:
[Table("OrderTrackingDetails")]
public class OrderTrackingDetailEntity
{
public int OrderTrackingID { get; set; }
[ForeignKey("OrderTrackingID")]
public OrderTrackingEntity OrderTracking { get; set; }
// EF Keeps on selecting this field
[Key, Column(Order = 1)]
public int ID { get; set; }
public string LineNumber { get; set; }
public decimal? UnitPrice { get; set; }
public int Quantity { get; set; }
}