在asp.net上创建约束或索引时出错

问题描述 投票:0回答:1

我有三个表应用程序用户、帖子、评论

用户和帖子之间是一对多

帖子和评论之间是一对多

这些关系已 CasCade 删除并成功运行

但是当我尝试添加用户和评论之间的一对多关系来注册谁创建了此评论时,我希望在删除用户时他的评论也被删除

but it give me this error Introducing FOREIGN KEY constraint 'FK_AcademyPosts_AspNetUsers_AcademyId' on table 'AcademyPosts' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.

这是我的代码

应用程序用户模型代码

public virtual ICollection<Comments> Comments { get; set; }

备注型号代码

public ApplicationUser User { get; set; }
public string UserId { get; set; } 

配置代码

builder
    .HasOne(user => user.User)
    .WithMany(comment => comment.Comments)
    .HasForeignKey(user => user.UserId)
    .OnDelete(DeleteBehavior.Cascade);
c# asp.net-core ef-code-first
1个回答
0
投票

是使用EF Core时的级联删除问题,是MS SQL Server本身的限制。

你的三个表的一对多关系会实现用户-帖子-评论的级联删除,同时你新建的用户/评论关系在删除评论的同时也会删除评论,这在服务器中是不允许的.

您的配置导致了用户和评论之间的级联删除,我们最好避免这种情况。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Comment>()
        .HasOne(e => e.User)
        .WithMany(e => e.Comments)
        .OnDelete(DeleteBehavior.ClientCascade);
}

然后需要手动修改删除方法。

Load the comment
级联删除。

// POST: Users/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
    if (_context.User == null)
    {
        return Problem("Entity set 'CascadeDeletingContext.User'  is null.");
    }
    var user = await _context.User.FindAsync(id);
    //Here is the loading
    var comments = await _context.Comment.Where(e => e.UserId == id).ToListAsync();
    if (user != null)
    {
        _context.User.Remove(user);
    }
    
    await _context.SaveChangesAsync();
    return RedirectToAction(nameof(Index));
}

创建一个新的应用程序和数据库,因为在我的测试中迁移历史会影响数据库并且错误始终存在。

你也可以参考官方文档,里面有一个和你的问题一模一样的示例。 https://learn.microsoft.com/en-us/ef/core/ saving/cascade-delete

© www.soinside.com 2019 - 2024. All rights reserved.