【问题标题】:EF Code First foreign key definition / left join / navigation properties?EF Code First外键定义/左连接/导航属性?
【发布时间】:2013-02-21 14:55:55
【问题描述】:

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

用户发布 cmets 并且其他用户可以“同意”该评论,有点像 Facebook 的“赞”系统。我正在使用 lambda 进行查询,我可以这样做:

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

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

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

这可能吗?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 嗯好的,我添加了一个公共列表(我忘了提到我有一个从 CommentAgree 到 Comment 的 FK)。然后在我的 lambda 中,我可以执行 c.CommentAgrees.Count() 这正是我想要的!我认为这对我很重要,但我会考虑正确映射它,因为我以前没有这样做过,我会检查 Fluent API。感谢您的帮助
    猜你喜欢
    • 2014-01-20
    • 2016-01-09
    • 1970-01-01
    • 2013-10-21
    • 2017-06-26
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多