2011-01-15 7 views
4

私は最近Entity Framework Code First CTP5をダウンロードしましたが、このシナリオでは問題があります。次のように私は2つのテーブルを持っている:EFコードまず、あるテーブルから別のテーブルに2つの外部キーを取得するにはどうすればよいですか?

 
Members table : 
    ID 
    Name 

Comments table : 
    ID 
    Comment 
    CommentedMemberID 
    CommentMemberID 

をそして、データは次のようにする必要があります。下記のように続いて、私はコード化された

 
Members 
ID Name 
1 Mike 
2 John 
3 Tom 

Comments 
ID Comment CommentedMemberID CommentMemberID 
1 Good 1 2  
2 Good 1 3 
3 Bad 2 1 

public class Member 
{ 
    public int ID {get; set; } 
    public string Name { get; set;} 
    public virtual ICollection<Comment> Comments { get; set;} 
} 

public class Comment 
{ 
    public int ID { get; set; } 
    public string Comment { get; set; } 
    public int CommentedMemberID { get; set; } 
    public int CommentMemberID{ get; set; } 

    public virtual Member CommentedMember { get; set; } 
    public virtual Member CommentMember { get; set; } 
} 

public class TestContext : DbContext 
{ 
    public DbSet<Member> Members { get; set; } 
    public DbSet<Comment> Comments { get; set; } 
} 

しかし、ときに私が実行します私のcshtmlのこれらのモデルは、それは私に "CommentMemberインスタンスを作成することはできません"と言っているエラーを与えるか、またはそのような何か(申し訳ありませんが、私はすでにEFコードの最初の評価を進めるために、同じエラーを再現することはできません)。

TestContextでもOnModelCreatingを使用しようとしましたが、良い指示が見つからず、何をすべきかわかりません。私はEF Code First CTP3のブログ記事を見ましたが、そのバージョンにはRelatedTo属性があるようですが、今はなくなっています。

誰でも正しく動作させる方法を知っていますか?それとも、このシナリオでは完全に間違った方法ですか?

おかげで、

答えて

6

は、これは特殊なケースであり、あなたがあなたの関連付けを設定するには、流暢なAPIを使用する必要があります。これはトリックを行います:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Comment>().HasRequired(c => c.CommentedMember) 
            .WithMany(m => m.Comments) 
            .HasForeignKey(c => c.CommentedMemberID) 
            .WillCascadeOnDelete(); 

    modelBuilder.Entity<Comment>().HasRequired(c => c.CommentMember) 
            .WithMany() 
            .HasForeignKey(c => c.CommentMemberID) 
            .WillCascadeOnDelete(false); 
} 
+1

ありがとうございました。それはトリックでした!私は流暢なAPIを見てみましょう。 –

関連する問題