2016-08-16 199 views
0

我已经读了许多关于映射UserFriends的线程,但我一直没能找到一个好的答案。我想要的是,一个ApplicationUser应该可以有零对多的朋友请求,并且以后可以为零对许多朋友。模型用户 - > FriendRequests与实体框架代码第一

正如你可以看到在模型FriendRequest有两个ApplicationUsersUserFutureFriend这是什么造成的问题。试图创建数据库时

public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,CustomUserClaim> 
{ 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager, string authenticationType) 
    { 
CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, authenticationType); 
     // Add custom user claims here 
     return userIdentity; 
    } 

    public ApplicationUser() 
    { 
    } 

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

    public virtual ICollection<FriendRequest> FriendRequests { get; set; } 
} 

public class FriendRequest 
{ 
    public int UserId { get; set; } 
    public int FutureFriendId { get; set; } 
    public virtual ApplicationUser User { get; set; } 
    public virtual ApplicationUser FutureFriend { get; set; } 
    public DateTime? RequestTime { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<ApplicationUser>() 
    .HasMany(u => u.FriendRequests) 
    .WithRequired(f => f.User) 
    .HasForeignKey(f => f.UserId); 

    modelBuilder.Entity<FriendRequest>() 
    .HasKey(f => new { f.UserId, f.FutureFriendId }); 

    modelBuilder.Entity<FriendRequest>() 
    .HasRequired(f => f.FutureFriend) 
    .WithMany() 
    .HasForeignKey(f => f.FutureFriendId); 

    //Did not work either 
    //modelBuilder.Entity<FriendRequest>().HasKey(f => new { UserId = f.UserId, FutureFriendId = f.FutureFriendId }); 
    //modelBuilder.Entity<FriendRequest>() 
    // .HasRequired(f => f.User) 
    // .WithMany() 
    // .HasForeignKey(f => f.UserId); 
    //modelBuilder.Entity<FriendRequest>() 
    // .HasRequired(f => f.FutureFriend) 
    // .WithMany() 
    // .HasForeignKey(f => f.FutureFriendId) 
    // .WillCascadeOnDelete(false); 
} 

错误:

引入外来KEY约束 'FK_dbo.FriendRequests_dbo.AspNetUsers_UserId' 上表 'FriendRequests' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外来 KEY约束。无法创建约束或索引。请参阅前面的 错误。

更新:

决定重塑类,最终的解决方案可以在这里找到:SO

+1

加上'.WillCascadeOnDelete(假)''的.HasForeignKey(..)'调用之一后。 –

+1

@IvanStoev谢谢!这工作,添加'.WillCascadeOnDelet e(false)'两个'.HasForeignKey(..)' – Ogglas

回答

1

谢谢@IvanStoev!

我的模型中的一个解决方案是在.HasForeignKey(..)中的一个或两个上禁用.WillCascadeOnDelet‌​e(false)。由于CASCADE会导致相应的行从引用表中删除,如果该行从父表中被删除...并且我有点偏执狂。

我决定取消对两个一对多关系和多对多releations代替CascadeDeleteConvention。

我的解决办法:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 

可能的解决办法:

modelBuilder.Entity<ApplicationUser>() 
    .HasMany(u => u.FriendRequests) 
    .WithRequired(f => f.User) 
    .HasForeignKey(f => f.UserId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<FriendRequest>() 
    .HasKey(f => new { f.UserId, f.FutureFriendId }); 

modelBuilder.Entity<FriendRequest>() 
    .HasRequired(f => f.FutureFriend) 
    .WithMany() 
    .HasForeignKey(f => f.FutureFriendId) 
    .WillCascadeOnDelete(false);