asp.Net 核心一对多关系 UPDATE 语句与 FOREIGN KEY 约束冲突

asp.Net Core one-to-many relationship UPDATE statement conflicted with the FOREIGN KEY constraint

我正在使用 Entity Framework 核心并在 2 table 之间创建了一对多关系:

public class Fgf
  {
     public int FgfID { get; set; }

    public string FGFName { get; set; }
    ...
    public ICollection<ApplicationUser> ApplicationUsers { get; set; }

}


 public class ApplicationUser : IdentityUser
    {
    public string FirstName { get; set; }
    public string LastName { get; set; }
...
}

在这种情况下,EFCore 在 ApplicationUser 中自动添加了 FgfID 列,但我无法在控制器中访问它。

我正在尝试在 ApplicationUser 中添加 FgfID

 public class ApplicationUser : IdentityUser
    {
    public string FirstName { get; set; }

    public string LastName { get; set; }
...

   public int FgfID { get; set; }
   public Fgf Fgf { get; set; }
}

我有一个表单,我在其中创建了一个 FGF 并为其分配了一个带有选择列表的用户。我正在使用带有 POST 操作的简单表单。我没有为表单使用模型,因为我在这个 Razor 页面上有另一个表单。

在我的控制器中:

  [HttpPost]
  public async Task<IActionResult> NewFgf(string FGFName, string ApplicationUser)
    {
        if (ModelState.IsValid) {
            var fgf = new Fgf
            {
                FGFName = FGFName,                    
            };

            var usertoupdate = await _context.Users
                .Where(c=> c.Id == ApplicationUser)
                .SingleOrDefaultAsync();

            usertoupdate.FgfID = fgf.FgfID;
            
            _context.Users.Update(usertoupdate);
            _context.Add(fgf);             
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));              
        }

        return View();
    }

我得到的错误是:

SqlException:UPDATE 语句与 FOREIGN KEY 约束“FK_AspNetUsers_Fgf_FgfID”冲突。冲突发生在数据库“aspnet-StreamPixelVer2-3E2C2112-15B8-48A4-8619-4773C5ADBFBD”,table“dbo.Fgf”,列'FgfID'。 声明已终止。

我做错了什么?将数据保存到与 Asp.net 核心具有多对一、一对多关系的数据库中的最佳做法是什么?

因为你没有 fgf.FgfID,试试这个:

using Microsoft.EntityFrameworkCore.ChangeTracking;

.....
....

var usertoupdate = await _context.Set<ApplicationUser>()
                .Where(c=> c.Id == applicationUser.Id)
                .SingleOrDefaultAsync();

      var fgf = new Fgf
            {
                FGFName = FGFName,                    
            };  
        

  fgf.ApplicationUsers = new ObservableCollectionListSource<ApplicationUser>();
  fgf.ApplicationUsers.Add(usertoupdate);  
    _context.Set<Fgf>().Add(fgf);
   await _context.SaveChangesAsync();