2

我有订单付款的一对多关系:

public class Order
{
    [Key]
    public Guid SerialNumber { get; set; }

    public string OrderNumber { get; set; }

    ...

    [ForeignKey("OrderNumber")]
    public virtual ICollection<Payment> Payments { get; set; }
}

public class Payment
{
    [Key]
    public string SerialNumber { get; set; }

    public string OrderNumber { get; set; }

    ...

    public decimal Amount { get; set; }
}

尽管记录可用,但 Payments 集合始终显示 0 个元素。我查看了跟踪,问题似乎出在生成的 SQL 查询上——它试图将 Order.SerialNumber 与 Payment.OrderNumber 匹配。

我该如何解决这个问题,最好使用数据注释?提前致谢!

4

1 回答 1

1

它试图将 Order.SerialNumber 与 Payment.OrderNumber 匹配。

是的,因为这正是您所建模的。ForeignKey属性没有描述相关表中外键属性的名称。它描述了同一个表中外键属性的名称,它用于将导航属性与其键配对,因此正确的用法是:

public class Order
{
    [Key]
    public Guid SerialNumber { get; set; }

    public string OrderNumber { get; set; }

    ...

    public virtual ICollection<Payment> Payments { get; set; }
}

public class Payment
{
    [Key]
    public string SerialNumber { get; set; }

    // Foreign key must have the same type as primary key in the principal table
    public Guid OrderNumber { get; set; }

    ...

    public decimal Amount { get; set; }

    // Reverse navigation property to principal associated with foreign key
    [ForeignKey("OrderNumber")]
    public virtual Order Order { get; set; }
}

如果您不想在 Payment 中使用导航属性,则必须使用 fluent API 来描述映射:

modelBuilder.Entity<Order>()
            .HasMany(o => o.Payments)
            .WithRequired()
            .HasForeignKey(p => p.OrderNumber);

如果您有现有的数据库并且您的关系确实以表OrderNumber中的列为目标,Order则意味着它必须用唯一约束标记 - 这种关系目前无法在 EF 中映射,因为它还不支持唯一约束。

于 2012-09-18T18:40:46.510 回答