【问题标题】:asp.Net Core one-to-many relationship UPDATE statement conflicted with the FOREIGN KEY constraintasp.Net Core 一对多关系 UPDATE 语句与 FOREIGN KEY 约束冲突
【发布时间】:2021-01-09 21:38:15
【问题描述】:

我正在使用 Entity Framework Core 并在 2 个表之间创建了一对多关系:

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”、表“dbo.Fgf”、列“FgfID”中。 声明已终止。

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

【问题讨论】:

  • 更新前添加fgf

标签: c# asp.net-core .net-core entity-framework-core one-to-many


【解决方案1】:

由于您没有 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();

【讨论】:

  • ObservableCollectionListSource - 找不到类型或命名空间名称“ObservableCollectionListSource”。
  • 抱歉有错别字。我刚刚更新了答案
  • 尝试使用 Microsoft.EntityFrameworkCore.ChangeTracking 命名空间添加
  • 如何构造一个查询来选择所有未分配 fgf 的用户。由于我仍然无法访问 ApplicationUsers 实体中的 FgfID 列,因此我的查询显示错误。这是查询:` return Json(_context.Users .Select(u => new { UserId = u.Id, LastName = u.LastName, FirstName = u.FirstName, UserEmail = u.Email}) .OrderBy(o = > o.UserEmail) .Where( f => f.FgfID==null ) .ToList()); `
  • try _context.Set().Where( u => u.FgfID==null ).Select(u => new { UserId = u.Id, LastName = u.LastName, FirstName = u.FirstName, UserEmail = u.Email}).OrderBy(o => o.UserEmail).ToArray(); - @Aram
猜你喜欢
  • 2023-03-06
  • 2022-01-08
  • 2019-05-09
  • 2017-05-07
  • 2021-10-18
  • 1970-01-01
  • 2015-02-02
相关资源
最近更新 更多