I have previously asked a question here on SO about a similar topic but have since taken a different approach. This is my model:
public class ApplicationUser
@Mukesh thanks for your answer but I decided to take another approach since your solution did not get all rows in Friend were the user is either RequestedBy or RequestedTo. This is my solution:
public class ApplicationUser : IdentityUser
{
public async Task GenerateUserIdentityAsync(UserManager manager, string authenticationType)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
// Add custom user claims here
return userIdentity;
}
public ApplicationUser()
{
SentFriendRequests = new List();
ReceievedFriendRequests = new List();
}
[Required]
public string Alias { get; set; }
public string Name { get; set; }
public byte[] ProfilePicture { get; set; }
public virtual ICollection SentFriendRequests { get; set; }
public virtual ICollection ReceievedFriendRequests { get; set; }
[NotMapped]
public virtual ICollection Friends {
get
{
var friends = SentFriendRequests.Where(x => x.Approved).ToList();
friends.AddRange(ReceievedFriendRequests.Where(x => x.Approved));
return friends;
} }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove();
modelBuilder.Conventions.Remove();
modelBuilder.Entity()
.HasRequired(a => a.RequestedBy)
.WithMany(b => b.SentFriendRequests)
.HasForeignKey(c => c.RequestedById);
modelBuilder.Entity()
.HasRequired(a => a.RequestedTo)
.WithMany(b => b.ReceievedFriendRequests)
.HasForeignKey(c => c.RequestedToId);
}
public class Friend
{
[Key, Column(Order = 0)]
public int RequestedById { get; set; }
[Key, Column(Order = 1)]
public int RequestedToId { get; set; }
public virtual ApplicationUser RequestedBy { get; set; }
public virtual ApplicationUser RequestedTo { get; set; }
public DateTime? RequestTime { get; set; }
public DateTime? BecameFriendsTime { get; set; }
public FriendRequestFlag FriendRequestFlag { get; set; }
[NotMapped]
public bool Approved => FriendRequestFlag == FriendRequestFlag.Approved;
public void AddFriendRequest(ApplicationUser user, ApplicationUser friendUser)
{
var friendRequest = new Friend()
{
RequestedBy = user,
RequestedTo = friendUser,
RequestTime = DateTime.Now,
FriendRequestFlag = FriendRequestFlag.None
};
user.SentFriendRequests.Add(friendRequest);
}
}
public enum FriendRequestFlag
{
None,
Approved,
Rejected,
Blocked,
Spam
};