2017-01-25 5 views
3

これは重複した質問かもしれませんが、私は同様の質問に提供された回答を使って試してみましたが、何も成功しませんでした。EF 5複合主キー(何らかの理由で動作しません)

状況は次のとおりです。私は学校プロジェクト用の仮想銀行を作成しています。最初のプロトタイプでは、単にアカウントテーブルと取引テーブルが必要です。トランザクションとアカウントの関係は、すべてのトランザクションが2つのアカウント(FromとTo)を参照し、アカウントが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

ない百パーセント確かに、しかし、問題は、 'Account' PK' ID'列(文字列のために使用される様々な種類が原因で発生することが)と 'Transaction'' FromId' /' ToId'カラム(int) –

+0

プロパティ名を 'AccountId'とし、' id'型をintに変更してみてください。また、主キーを作成するために 'id'プロパティに' [Key] '属性を適用する必要があると思います。 –

+0

両方のおかげで、文字列<-> intに関する問題は解決されましたが、手元の問題は解決されませんでした。また、アカウントのIDフィールドに[Key]を追加しても違いはありませんでした(私が読んだように、名前IDの整数フィールドがデフォルトでプライマリキーであることは間違いありません) – Jarinus

答えて

0

あなたの問題は、トランザクションとアカウントに異なるタイプのキーがあることです。変更してみてください。

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

また、あなたがそのような複合キーを望んでいることを知って流暢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; } 
} 
+0

このモデルビルダーの行はどこに追加しますか?また、int/stringの問題に気づいてくれてありがとう、私は何とか気付かなかった!しかし、手元に問題は解決していませんでした。 – Jarinus

+0

ジャリナス、私は自分の答えを編集する。 – CrazyBaran

+0

どこでDbContextクラスを見つけることができますか?私はこのエラーが発生したときにController + Contextクラスを作成していました。 – Jarinus

関連する問題