我需要在我的应用程序中使用Identity。我不知道如何更改用户表。所以我决定为图片创建一个额外的模型 Avatar 。
public class Avatar
{
[Required]
[DataType(DataType.MultilineText)]
public string ImagePath { get; set; }
[Required]
public string UserId { get; set; }
[Required]
public int AvatarId { get; set; }
}
在 AccountController 的注册操作中,我想为所有用户添加默认头像:
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
Avatar defaultAvatar = new Avatar { UserId = User.Identity.GetUserId(), ImagePath = "default.png"};
db.Avatars.Add(defaultAvatar);
db.SaveChanges();
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
return View(model);
}
但我有一个错误:名称&#39; db&#39;在当前上下文中不存在。我选择了正确的方法来实现我的想法?或者有更简单的方法吗?
答案 0 :(得分:2)
通过模板生成的某些控制器会获得private YourDbContext db = new YourDbContext();
成员。这使您可以使用任何操作方法访问数据库。
如果你想在AccountController
中也想要这个,你也需要在那里添加声明。
或者将其包装在using
块中:
using (var db = new YourDbContext())
{
db.Avatars.Add(defaultAvatar);
db.SaveChanges();
}
答案 1 :(得分:2)
您必须在控制器构造函数中实例化DbContext。
public class YourController : Controller
{
private readonly ApplicationDbContext _db;
public YourController()
{
_db = new ApplicationDbContext;
}
//Optional: Poor man's dependency injection for unit test
//Also I highly recommend to have a look at IOC containers.
public YourController(ApplicationDbContext db)
{
_db = db;
}
}