C# Model User, Friend Requests and Friends with Entity Framework Code First

后端 未结 2 1982
北恋
北恋 2021-01-15 20:06

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         


        
2条回答
  •  青春惊慌失措
    2021-01-15 20:47

    @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
    };
    

提交回复
热议问题