我已经读了许多关于映射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