【问题标题】:Model User -> FriendRequests with Entity Framework code first首先使用实体​​框架代码建模用户 -> FriendRequests
【发布时间】:2016-08-16 14:12:53
【问题描述】:

我已经阅读了很多关于映射UserFriends 的帖子,但我一直无法找到一个好的答案。我想要的是ApplicationUser 应该能够有零到多个朋友请求,然后零到多个朋友。

正如您在模型中看到的那样,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);
}

尝试创建数据库时出错:

引入 FOREIGN KEY 约束 表上的“FK_dbo.FriendRequests_dbo.AspNetUsers_UserId” 'FriendRequests' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN 关键约束。无法创建约束或索引。见上 错误。

更新:

决定改造类,最终解决方案可以在这里找到:SO

【问题讨论】:

  • .HasForeignKey(..) 调用之一之后添加.WillCascadeOnDelete(false)
  • @IvanStoev 谢谢!这有效,在.HasForeignKey(..) 上都添加了.WillCascadeOnDelet‌​e(false)

标签: c# entity-framework ef-code-first


【解决方案1】:

谢谢@IvanStoev!

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

我决定在一对多关系和多对多关系上禁用 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多