EF Code First外键定义/左连接/导航属性?

时间:2013-02-21 14:55:56

标签: c# entity-framework asp.net-mvc-4 lambda foreign-keys

假设我有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
});

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

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

这可能吗?

由于

1 个答案:

答案 0 :(得分:1)

最好的方法可能是使用Entity Framework的功能并创建导航属性,而不是显式使用LINQ来执行仅用于相关数据的连接。

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

Comment上的集合导航属性应该实现ICollection(例如List<CommentAgree>),并且{{1}上将有Comment类型的引用导航属性输入。

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

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