我有一个项目,在同一个数据库中有几个表。
public class UserImage
{
[Key]
public int Id { get; set; }
public string OwnerId { get; set; }
[ForeignKey("OwnerId")]
public virtual ApplicationUser Owner { get; set; }
//some fields are removed for brevity
}
public class FriendRequest
{
[Key]
public int Id { get; set; }
public string UserId { get; set; }
public string FutureFriendUserId { get; set; }
[ForeignKey("UserId")]
public virtual ApplicationUser User { get; set; }
[ForeignKey("FutureFriendUserId")]
public virtual ApplicationUser FutureFriendUser { get; set; }
}
public class ApplicationUser : IdentityUser
{
//some fields are removed for brevity
public virtual ICollection<UserImage> UserImages { get; set; }
public virtual ICollection<FriendRequest> FriendRequests { get; set; }
问题是我可以找到属于用户的图像:
var userStore = new UserStore<ApplicationUser>(db);
var userManager = new UserManager<ApplicationUser>(userStore);
ApplicationUser user = userManager.FindById(User.Identity.GetUserId());
IEnumerable<string> imgs = (from image in user.UserImages select Url.Content(image.ImageUrl)).Skip(skip).Take(5).ToList();
但是我不能对FriendRequests
使用相同的技术。如果我在数据库中搜索具有UserId == User.Identity.GetUserId()
或其他id的行,结果就是我所期望的。
有什么问题?
答案 0 :(得分:1)
你在这里创造的是一种自我引用的多对多关系。在FriendRequest
课程中,您有两个属性是[{1}}的外键,但在ApplicationUser
课程中,您只有一个ApplicationUser
的集合。实体框架不知道哪个外键实际上应该组成这个集合。因此,您必须进行一些更改才能使其正常工作。
您必须添加其他导航属性。从本质上讲,在FriendRequest
课程中,您最终会得到以下内容:
ApplicationUser
同样,您需要为每个外键创建一个集合。
您需要添加一些流畅的配置来帮助Entity Framework确定每个集合使用哪个外键:
public virtual ICollection<FriendRequest> SentFriendRequests { get; set; }
public virtual ICollection<FriendRequest> ReceivedFriendRequests { get; set; }