导航属性使用两个外键

时间:2015-05-11 15:00:16

标签: entity-framework asp.net-mvc-5 entity-framework-6

我有一个项目,在同一个数据库中有几个表。

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的行,结果就是我所期望的。 有什么问题?

1 个答案:

答案 0 :(得分:1)

你在这里创造的是一种自我引用的多对多关系。在FriendRequest课程中,您有两个属性是[{1}}的外键,但在ApplicationUser课程中,您只有一个ApplicationUser的集合。实体框架不知道哪个外键实际上应该组成这个集合。因此,您必须进行一些更改才能使其正常工作。

  1. 您必须添加其他导航属性。从本质上讲,在FriendRequest课程中,您最终会得到以下内容:

    ApplicationUser

    同样,您需要为每个外键创建一个集合。

  2. 您需要添加一些流畅的配置来帮助Entity Framework确定每个集合使用哪个外键:

    public virtual ICollection<FriendRequest> SentFriendRequests { get; set; }
    public virtual ICollection<FriendRequest> ReceivedFriendRequests { get; set; }