导航 属性 在 Entity Framework 中为空

Navigation property is null in Entity Framework

我正在使用 ASP.NET MVC 构建一个简单的社交网络,我遇到了一个问题。我对此很陌生,所以这可能是一个简单的修复,但这里是:

我正在尝试设置一个用户 (ApplicationUser) 可以向另一个用户发送好友请求的系统,到目前为止,好友请求已在数据库中注册好友请求的发送者和接收者。

这是给朋友的模型request/friend:

public class Friend
{
    public int Id { get; set; }
    public ApplicationUser User { get; set; }
    public ApplicationUser UserFriend { get; set; }
    public DateTime BecameFriends { get; set; }
    public bool Status { get; set; }

}

问题是当我试图显示已登录用户的活跃好友请求时。我有一个看起来像这样的 ShowFriendRequest 操作:

public ActionResult ShowFriendRequests(string Id)
{
        //ADC is the ApplicationDataContext

        var result = from f in ADC.Friends select f;
        List<Friend> SearchResult = new List<Friend>();

        SearchResult = result.Where(x => 
        x.UserFriend.Id.Equals(Id)).ToList();

        var model = new FriendViewModel
        {
            FriendList = SearchResult
            //this is a List<Friend>
        };

        return PartialView(model);
 }

所以这里的问题是:

好友中总共有 2 个好友请求 table,但只有一个针对已登录用户。在调试上面的操作时,它实际上发现一个好友请求存在,因为 FriendlistSearchResults 计数都是 1.

虽然当我尝试从视图或控制器中的 model.FriendlistSearchResult 中提取一些值时,我可以找到 ID 和状态,但 UserUserFriend 为空。对此的尝试可能如下所示:

System.Diagnostics.Debug.WriteLine(SearchResult[0].UserFriend.Id);

为什么从数据库中提取一个好友请求时 ApplicationUser 个实体为空?

问题出在以下行中:

var result = from f in ADC.Friends select f;

你既不是 lazy loading 也不是 eager loadingFriendApplicationUser。所以写你的结果查询如下:

var result = ADC.Friends.Include(f => f.ApplicationUser);

TanvirArjel 的回答是正确的,如果您想执行那种查询,则包含是必需的。

但你可以重写所有

var result = from f in ADC.Friends select f;
List<Friend> SearchResult = new List<Friend>();

//ADC is the ApplicationDataContext

SearchResult = result.Where(x => x.UserFriend.Id.Equals(Id)).ToList();

var model = new FriendViewModel
        {
            FriendList = SearchResult
            //this is a List<Friend>
        };


        return PartialView(model);

至此

var SearchResult = ADC.AspNetUsers.Select(x=>x.Friend).ToList(); //Maybe you will have FriendNavigation if you don't find Friend relationship.. use intellisense in that case

var model = new FriendViewModel
        {
            FriendList = SearchResult
            //this is a List<Friend>
        };


return PartialView(model);