我知道这可能是一个重复的问题,但我尝试使用提供给类似问题的答案,但我没有取得任何成功。
情况如下:我正在为学校项目创建一个虚拟银行,在第一个原型中我只想要一个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。
答案 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; }
}