一对多关系中 ASP.NET 中的外键为 NULL。如何在控制器中添加它?
Foreign key is NULL in ASP.NET in 1 to many relationship. How do I add it in controller?
我正在尝试在我的食谱 table 和 AspNet 用户 table 之间创建一对多关系,但每当我创建新食谱时,我最终都会将 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);
}
抱歉,如果我的 post 有点乱,这是我第一次 post 在这里编辑。
编辑:我不确定,但这是您要求的吗?我只需输入 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);
}
有多种方法可以做到这一点,我个人在 DbContext.SaveChanges()
方法中分配了审计信息,但这是一种超出此 post 范围的全局方法。
从根本上讲,您需要在调用 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);
}
NOTE: This is just a guide, in some cases the above assignment may not work, especially if your UserManager
does not use the save DbContext
instance. In such a case you will find it simpler to assign the user using the Foreign Key, not the navigation property.
我正在尝试在我的食谱 table 和 AspNet 用户 table 之间创建一对多关系,但每当我创建新食谱时,我最终都会将 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);
}
抱歉,如果我的 post 有点乱,这是我第一次 post 在这里编辑。
编辑:我不确定,但这是您要求的吗?我只需输入 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);
}
有多种方法可以做到这一点,我个人在 DbContext.SaveChanges()
方法中分配了审计信息,但这是一种超出此 post 范围的全局方法。
从根本上讲,您需要在调用 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);
}
NOTE: This is just a guide, in some cases the above assignment may not work, especially if your
UserManager
does not use the saveDbContext
instance. In such a case you will find it simpler to assign the user using the Foreign Key, not the navigation property.