【发布时间】:2016-08-16 14:12:53
【问题描述】:
我已经阅读了很多关于映射User 和Friends 的帖子,但我一直无法找到一个好的答案。我想要的是ApplicationUser 应该能够有零到多个朋友请求,然后零到多个朋友。
正如您在模型中看到的那样,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);
}
尝试创建数据库时出错:
引入 FOREIGN KEY 约束 表上的“FK_dbo.FriendRequests_dbo.AspNetUsers_UserId” 'FriendRequests' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN 关键约束。无法创建约束或索引。见上 错误。
更新:
决定改造类,最终解决方案可以在这里找到:SO
【问题讨论】:
-
在
.HasForeignKey(..)调用之一之后添加.WillCascadeOnDelete(false)。 -
@IvanStoev 谢谢!这有效,在
.HasForeignKey(..)上都添加了.WillCascadeOnDelete(false)
标签: c# entity-framework ef-code-first