2016-08-17 22 views
0

我以前在SO上提过一个关于类似主题的问题,但自此采取了不同的方法。这是我的模型:C#模型用户,朋友请求和朋友与实体框架代码第一

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

当我得到一个用户我wan't实体框架来获得朋友的所有行是用户eithe r RequestedByRequestedTo。这可能与EF有关吗?例如与Fluent API?我还想映射密钥,以便不需要[ApplicationUser_Id]

回答

0

@Mukesh感谢您的答案,但我决定采取另一种做法,因为您的解决方案并没有得到朋友的所有行是用户或者是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 
}; 
0

当我得到一个用户时,我不希望Entity Framework获取 中的所有行朋友是用户是RequestedBy或RequestedTo。这个 可能与EF有关吗?

是的,你完全可以做到这一点,只是你需要通过设置假的价值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 
    };