0

3つのテーブルがあるとしましょう:

[Table("Comments")]
public class Comment {
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [ForeignKey("Users")]
    public int UserId { get; set; }
    public virtual Users Users { get; set; }
    public string Text { get; set; }
}

[Table("Users")]
public class Users {
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string UserName { get; set; }
}

[Table("CommentAgree")]
public class CommentAgree {
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int CommentId { get; set; }
    public int UserId { get; set; }
}

ユーザーがコメントを投稿すると、他のユーザーはそのコメントに「同意」することができます。Facebook の「いいね」システムに少し似ています。クエリにラムダを使用していますが、次のことができます。

var query = db.Comments.Select(c => new {
            c.Id,
            c.Users.UserName,
            c.Text
});

CommentAgree への結合を作成するにはどうすればよいComment.Id = CommentAgree.CommentIdですか? Lambda で結合を記述できますが、誰もコメントに同意しない可能性があるため、左結合にする必要がありますが、それでも表示したいのです。

私はそれを正しい方法で行いたいので、外部キー、ラムダ結合、ナビゲーション プロパティなどで行うかどうかの提案を受け付けています。

これは可能ですか?

ありがとう

4

1 に答える 1

1

おそらく最善のアプローチは、LINQを明示的に使用して関連データのみの結合を実行するのではなく、EntityFrameworkの機能を使用してナビゲーションプロパティを作成することです。

タイプがデータアクセスのみを目的として作成されている場合は、関係の両端にナビゲーションプロパティを追加することと、既存の外部キープロパティを追加することをお勧めします。

のコレクションナビゲーションプロパティは(たとえば)Commentを実装する必要があり、タイプにタイプの参照ナビゲーションプロパティがあります。ICollectionList<CommentAgree>CommentCommentAgree

次に、データアノテーションまたは(できれば)流暢なAPIを使用して、マッピングで関係を定義する必要があります。

関連データを読み込むには、遅延読み込みまたは積極的な読み込み(Include拡張メソッドを使用)を使用するか、エンティティのエントリ情報からの明示的な読み込みを使用します。

于 2013-02-21T15:03:58.083 に答える