导航 属性 在 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,但只有一个针对已登录用户。在调试上面的操作时,它实际上发现一个好友请求存在,因为 Friendlist
和 SearchResults
计数都是 1.
虽然当我尝试从视图或控制器中的 model.Friendlist
或 SearchResult
中提取一些值时,我可以找到 ID 和状态,但 User
和 UserFriend
为空。对此的尝试可能如下所示:
System.Diagnostics.Debug.WriteLine(SearchResult[0].UserFriend.Id);
为什么从数据库中提取一个好友请求时 ApplicationUser
个实体为空?
问题出在以下行中:
var result = from f in ADC.Friends select f;
你既不是 lazy loading
也不是 eager loading
和 Friend
的 ApplicationUser
。所以写你的结果查询如下:
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);
我正在使用 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,但只有一个针对已登录用户。在调试上面的操作时,它实际上发现一个好友请求存在,因为 Friendlist
和 SearchResults
计数都是 1.
虽然当我尝试从视图或控制器中的 model.Friendlist
或 SearchResult
中提取一些值时,我可以找到 ID 和状态,但 User
和 UserFriend
为空。对此的尝试可能如下所示:
System.Diagnostics.Debug.WriteLine(SearchResult[0].UserFriend.Id);
为什么从数据库中提取一个好友请求时 ApplicationUser
个实体为空?
问题出在以下行中:
var result = from f in ADC.Friends select f;
你既不是 lazy loading
也不是 eager loading
和 Friend
的 ApplicationUser
。所以写你的结果查询如下:
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);