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 的“点赞”系统。我正在使用 lambda 进行查询,我可以这样做:

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

如何创建加入 CommentAgree on Comment.Id = CommentAgree.CommentId?我可以在 Lambda 中编写联接,但我需要它是左联接,因为没有人可能同意该评论,但我仍然希望它显示。

我想以正确的方式做到这一点,所以我愿意接受建议,是否通过外键、lambda 连接、导航属性......或其他方式来做到这一点?

这可能吗?

谢谢

4

1 回答 1

1

最好的方法可能是使用实体框架的功能并创建导航属性,而不是显式地使用 LINQ 来仅为相关数据执行连接。

如果您的类型只是为了访问数据而设计的,那么在关系的两端添加导航属性以及您已经拥有的外键属性可能是一个好主意。

集合导航属性 onComment应该实现ICollection(例如),并且您将在该类型上具有类型List<CommentAgree>的引用导航属性。CommentCommentAgree

然后,您必须使用数据注释或(最好)流畅的 API 来定义映射中的关系。

要加载相关数据,您可以使用延迟加载或急切加载(使用Include扩展方法),或使用实体条目信息中的显式加载。

于 2013-02-21T15:03:58.083 回答