繁体   English   中英

C#模型用户,使用实体框架代码的好友请求和好友

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

我之前曾在此处就类似主题问过一个问题,但此后采取了不同的方法。 这是我的模型:

public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,CustomUserClaim>
{   
    public ApplicationUser()
    {
        Friends = new List<Friend>();
    }

    [Required]
    public string Alias { get; set; }

    public virtual ICollection<Friend> Friends { get; set; }
}

public class Friend
{
    public virtual int Id { get; set; }

    public virtual ApplicationUser RequestedBy { get; set; }

    public virtual ApplicationUser RequestedTo { get; set; }

    public DateTime? RequestTime { get; set; }

    public FriendRequestFlag FriendRequestFlag { get; set; }
}

public enum FriendRequestFlag
{
    None,
    Approved,
    Rejected,
    Blocked,
    Spam
};

我可以使用这种方法添加好友,当我从数据库中获取好友时,它们会填充,例如:

public void AddFriendRequest(ApplicationUser user, ApplicationUser friendUser)
{
    var friendRequest = new Friend()
    {
        RequestedBy = user,
        RequestedTo = friendUser,
        RequestTime = DateTime.Now,
        FriendRequestFlag = FriendRequestFlag.None
    };

    user.Friends.Add(friendRequest);
}

当我运行上面的代码时,执行后数据库中的好友表如下所示:

的SQL

当我得到一个用户时,如果该用户是RequestedByRequestedTo我将不会使用Entity Framework获取Friend中的所有行。 这与EF有关吗? 例如使用Fluent API? 我还想映射键,以便不需要[ApplicationUser_Id]

@Mukesh感谢您的回答,但我决定采用另一种方法,因为您的解决方案未将Friend中的所有行都作为用户是RequestedBy还是RequestedTo。 这是我的解决方案:

public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,
CustomUserClaim>
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> 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<Friend>();
        ReceievedFriendRequests = new List<Friend>();
    }

    [Required]
    public string Alias { get; set; }

    public string Name { get; set; }

    public byte[] ProfilePicture { get; set; }

    public virtual ICollection<Friend> SentFriendRequests { get; set; }

    public virtual ICollection<Friend> ReceievedFriendRequests { get; set; }

    [NotMapped]
    public virtual ICollection<Friend> 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<OneToManyCascadeDeleteConvention>();
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

    modelBuilder.Entity<Friend>()
        .HasRequired(a => a.RequestedBy)
        .WithMany(b => b.SentFriendRequests)
        .HasForeignKey(c => c.RequestedById);

    modelBuilder.Entity<Friend>()
        .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
};

当我得到一个用户时,如果该用户是RequestedBy或RequestedTo,我将不会使用Entity Framework获取Friend中的所有行。 这与EF有关吗?

是的,您绝对可以这样做,只是您需要通过将false值设置为LazyLoadingEnabled来禁用延迟加载功能,

context.Configuration.LazyLoadingEnabled = false;

如果您也想在上述情况下获取朋友,则可以通过包含导航属性来获取朋友列表。

context.User.Include(x => x.Friends).ToList();

我还想映射键,以便不需要[ApplicationUser_Id]。

为了实现这一点,需要使用ForeignKey属性,以便它不会在表中生成[Application_Id]列,请遵循以下更新的模型。

public class ApplicationUser
    {
        [Key]
        public virtual int Id { get; set; }
        public ApplicationUser()
        {
            Friends = new List<Friend>();
        }
        [Required]
        public string Alias { get; set; }

        [ForeignKey("RequestedBy_Id")]
        public virtual ICollection<Friend> Friends { get; set; }
    }

    public class Friend
    {
        public virtual int Id { get; set; }

        [ForeignKey("RequestedBy")]
        public virtual int RequestedBy_Id { get; set; }
        public virtual ApplicationUser RequestedBy { get; set; }

        public virtual ApplicationUser RequestedTo { get; set; }

        public DateTime? RequestTime { get; set; }

        public FriendRequestFlag FriendRequestFlag { get; set; }
    }

    public enum FriendRequestFlag
    {
        None,
        Approved,
        Rejected,
        Blocked,
        Spam
    };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM