如何使用AccountController中其他控制器的`db`变量?

时间:2015-06-23 22:24:09

标签: c# asp.net-mvc

我需要在我的应用程序中使用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;在当前上下文中不存在。我选择了正确的方法来实现我的想法?或者有更简单的方法吗?

2 个答案:

答案 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;
    }
}