2012-09-18 73 views
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; } 
} 

尽管这些记录是可用,付款收集始终显示为0元。我查看了跟踪,问题似乎与生成的SQL查询 - 它试图将Order.SerialNumber与Payment.OrderNumber匹配。

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

+1

啊。我敢打赌,如果您将SerialNumber属性名称更改为“支付”上不同的内容,可以将其清除。你可能会考虑使用Association属性而不是ForeignKey,因为它可以让你在映射属性时更加具体。 –

回答

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; } 
} 

如果你不想在付款导航属性,你必须使用流畅API描述映射:

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

如果您现有的数据库和你的关系,真正的目标在OrderOrderNumber列这意味着它必须具有独特的约束标记 - 这种关系,目前尚无法在EF映射,因为它不支持独特的限制。

+0

谢谢拉迪斯拉夫,但都没有解决方案解决了这个问题。还有什么想法? – Jonathan

+0

你究竟想要映射什么? –

+0

我希望将Order.OrderNumber映射到Payment.OrderNumber。 – Jonathan