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?(最好使用属性)

EntityFramework 6使用错误的列作为父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; }
}