2016-08-17 9 views
0

これまで同様のトピックについての質問をここで行ってきましたが、その後は別のアプローチを採用しています。これは私のモデルである:C#Modelユーザー、フレンドリクエスト、エンティティフレームワークを持つフレンドコード

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

私は友達のすべての行を取得するためにEntity Frameworkのをwan'tしまうユーザーを取得すると、ユーザはeitheありましたr RequestedByまたはRequestedTo。これはEFで可能ですか?たとえばFluent APIを使用していますか?また、[ApplicationUser_Id]が必要ないようにキーをマップしたいと思います。私は、ユーザーを取得すると、ユーザはRequestedByかRequestedToのいずれかであるだった私は 友達のすべての行を取得するためにEntity Frameworkのをwan'tう

答えて

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

。これは とEFで可能ですか?

はい、あなたは絶対に、ちょうどあなたが上記のシナリオでは、同様の友人を取得したい場合は、あなたが得ることができる

context.Configuration.LazyLoadingEnabled = false; 

、LazyLoadingEnabledに偽の値を設定することにより、遅延ロード機能を無効にする必要があることを行うことができますナビゲーションプロパティを含むことで友人リストを作成します。

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 
    }; 
関連する問題