EF 5复合主键(由于某种原因不起作用)

时间:2017-01-25 11:18:07

标签: c# entity-framework asp.net-web-api

我知道这可能是一个重复的问题,但我尝试使用提供给类似问题的答案,但我没有取得任何成功。

情况如下:我正在为学校项目创建一个虚拟银行,在第一个原型中我只想要一个Account表和一个Transactions表。交易和账户之间的关系是每个交易引用两个账户(从和到),账户有0 ... n个交易。

我一直在使用的代码:

public class Transaction
{
    [Column(Order = 0), Key, ForeignKey("From")]
    public int FromID { get; set; }

    [Column(Order = 1), Key, ForeignKey("To")]
    public int ToID { get; set; }

    public float Amount { get; set; }

    public virtual Account From { get; set; }

    public virtual Account To { get; set; }
}

public class Account
{
    public int ID { get; set; }
    [Required]
    public String Email { get; set; }
    [Required]
    public float Balance { get; set; }

    [InverseProperty("From")]
    public virtual ICollection<Transaction> FromTransactions { get; set; }

    [InverseProperty("To")]
    public virtual ICollection<Transaction> ToTransactions { get; set; }
}

我使用了[Column(Order = 0)][Column(Order = 1)]这应该已经解决了问题,但VS仍会显示消息:

Unable to retrieve metadata for 'Bank_API.Models.Account'. Unable to
determine the composite primary key ordering for type
'Bank_API.Models.Transactions'. Use the ColumnAttribute or the HasKey
method to specify an order for composite primary keys.

这是我第一次使用ASP.NET或EF,所以请保持温和。

P.S。我正在使用.NET 4.6.1和EF 5。

1 个答案:

答案 0 :(得分:0)

您的问题是您在交易和帐户中拥有不同类型的密钥。尝试更改为:

public class Account
{
    public int ID { get; set; }
}

您还可以使Fluent API知道您想要复合键:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);
     modelBuilder.Entity<Transaction>().HasKey(x => new { x.FromID, x.ToID });
}

此覆盖方法应该在您的DbContext类中。 此外,属性ForeignKey应该是您的虚拟帐户,而不是像您一样:

public class Transaction
{
    [Column(Order = 0), Key]
    public int FromID { get; set; }

    [Column(Order = 1), Key]
    public int ToID { get; set; }

    public float Amount { get; set; }

    [ForeignKey("FromID")]
    public virtual Account From { get; set; }

    [ForeignKey("ToID")]
    public virtual Account To { get; set; }
}