假设我们有一个包含此实体的项目:
class User
{
public Guid Id { get; set; }
public List<Message> Messages { get; set; }
...
}
class Message
{
public Guid Id { get; set; }
public string Message { get; set; }
}
现在考虑一下我想获取某个用户发布的所有消息的场景,如何在不拉动用户信息的情况下实现此目的呢? (不使用context.Users.Include(...))? 我知道实体框架在Message表中创建了一个列,其中包含发布此消息的用户的Id,但是如何才能访问此值?因为它不是我原来班级的财产。
答案 0 :(得分:2)
您可以将导航属性添加到Message
类:
public class Message
{
public Guid Id { get; set; }
public string Message { get; set; }
public virtual User User { get; set; }
}
然后查询您的上下文:
var userMessages = context.Messages
.Where(m => m.User.Id == 5);
这是更简洁的方法。或者,您可以从用户开始,但这有点尴尬:
var userMessages = context.Users
.Where(u => u.Id == 5)
.SelectMany(u => u.Messages);
这两种方法最终都会生成类似的SQL,如下所示:
SELECT [Extent1].[Column1],
[Extent1].[Column2],
[Extent1].[Column3]
FROM [dbo].[Messages] AS [Extent1]
WHERE 5 = [Extent1].[UserId]
答案 1 :(得分:1)
您可以明确定义FK,这样您就不必解析用户对象。
class Message
{
public Guid Id { get; set; }
public string Message { get; set; }
public int UserID { get; set; }
[ForeignKey("UserID")]
public virtual User User { get; set; }
}
然后在需要时对用户进行操作,但如果您只想通过UserID拉取或更改用户ID,则可以这样做。