2016-08-16 197 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);