我已經讀了許多關於映射User
和Friends
的線程,但我一直沒能找到一個好的答案。我想要的是,一個ApplicationUser
應該可以有零對多的朋友請求,並且以後可以爲零對許多朋友。模型用戶 - > FriendRequests與實體框架代碼第一
正如你可以看到在模型FriendRequest
有兩個ApplicationUsers
,User
和FutureFriend
這是什麼造成的問題。試圖創建數據庫時
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
加上'.WillCascadeOnDelete(假)''的.HasForeignKey(..)'調用之一後。 –
@IvanStoev謝謝!這工作,添加'.WillCascadeOnDelet e(false)'兩個'.HasForeignKey(..)' – Ogglas