在 ASP.NET 中,外键为 NULL,在 1 对多的关系中。如何在控制器中添加它?

Posted

技术标签:

【中文标题】在 ASP.NET 中,外键为 NULL,在 1 对多的关系中。如何在控制器中添加它?【英文标题】:Foreign key is NULL in ASP.NET in 1 to many relationship. How do I add it in controller? 【发布时间】:2021-12-12 06:25:51 【问题描述】:

我正在尝试在我的配方表和 AspNet 用户表之间创建一对多的关系,但是每当我创建一个新配方时,我都会以 NULL 作为我的外键。 public virtual ApplicationUser ApplicationUser get; set; 在我的配方模型中,并且 public List<Recipe> Recipes get; set; 在我的 ApplicationUser 模型中

Recipes table 在 DbInitializer 中添加了一些测试配方之后。第 3 行是通过 localhost 创建的,外键为 NULL。

  foreach (var u in db.Users.Include(b => b.Recipes) )
        
            for (int i = 1; i < 3; i++)
            
                u.Recipes.Add(new Recipe
                
                    Title = $"i",
                    Introduction =  $"i",
                    Ingredients =  $"i",
                    Instructions =  $"i", 
                    Nutrients =  $"i"
                    
                );
            
        
        db.SaveChanges();

我只是不知道如何在 Controller 中设置外键,以便在创建新配方时使用:

        [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("Id,Title,Introduction,Ingredients,Instructions,Nutrients")] Recipe recipe)
    
        if (ModelState.IsValid)
        
            _context.Add(recipe);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        
        return View(recipe);
    

对不起,如果我的帖子很乱,这是我第一次在这里发帖。

编辑:我不确定,但这是你要求的吗?我只需输入 user.Id 就可以访问用户 ID 对吗?

   public class RecipesController : Controller

    private readonly ApplicationDbContext _context;
    private readonly UserManager<ApplicationUser> _userManager;

    public RecipesController(ApplicationDbContext context, UserManager<ApplicationUser> userManager)
    
        _context = context;
        _userManager = userManager;
    

编辑 2:感谢您的帮助,代码现在正确分配了外键。

        public async Task<IActionResult> Create([Bind("Id,Title,Introduction,Ingredients,Instructions,Nutrients")] Recipe recipe)
    
        if (ModelState.IsValid)
        
            // Adding the foreign key to recipes
            var user = await _userManager.GetUserAsync(User);
            recipe.UserId = user.Id;
            
            _context.Add(recipe);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        
        return View(recipe);
    

【问题讨论】:

您需要分配Id或User对象,如果客户端不打算传入,则必须在Create方法体中进行。向我们展示如何检索用户 ID 的代码,我们可以向您展示如何分配它 我已经编辑过了,但我不知道这是否正确。那就是控制器中的代码。我可以写“var user = await _userManager.GetUserAsync(User);”吗?那么在create body中的user.Id呢? 基本上是的,但是当我们发布有关 EF 关系的问题时,您应该发布Recipe 的整个类定义以及流畅的配置(如果有的话)。如果您使用的是属性表示法,那么可能不会有任何流利的帖子。 【参考方案1】:

有很多方法可以做到这一点,我个人在 DbContext.SaveChanges() 方法中分配审计信息,但这是一种全局方法,超出了本文的范围。

从根本上讲,您需要在调用 SaveChanges() 之前分配用户,因此以下代码可能适用于您的情况:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Title,Introduction,Ingredients,Instructions,Nutrients")] Recipe recipe)

    if (ModelState.IsValid)
    
        // assign the user
        var user = await _userManager.GetUserAsync(User);
        recipe.ApplicationUser = user;

        _context.Add(recipe);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    
    return View(recipe);

注意:这只是一个指南,在某些情况下上述分配可能不起作用,特别是如果您的UserManager 不使用保存DbContext 实例 .在这种情况下,您会发现使用外键而不是导航属性来分配用户更简单。

【讨论】:

以上是关于在 ASP.NET 中,外键为 NULL,在 1 对多的关系中。如何在控制器中添加它?的主要内容,如果未能解决你的问题,请参考以下文章

EF 外键为 NULL

Hibernate多对一更新外键为null

MySQL没有结果,因为外键为NULL

sql 关联查询外键为空的情况

无法启用约束。一行或多行包含违反非空、唯一或外键约束的值。 ASP.NET C#

SQL Server 使用 2 个表(外键?) ASP.NET