在MVC 5中访问已存在的数据上下文

时间:2013-11-06 15:53:29

标签: c# asp.net asp.net-mvc asp.net-mvc-5

所以,我对整个MVC和ASP.NET事情都很陌生。

我在VS2013中创建了一个新的MVC应用程序,现在正在自定义它。 目前,当我可以修改用户属性时,我正在编写管理员区域。

整个管理部分绑定到adminController。在此控制器中,我创建了一个新的UserContext来访问用户数据库。 但是,由于应用程序已经在AccountController中定义了用户上下文,因此不需要这样做。

在AdminController中访问UserContext的最佳做法是什么?

/ edit:在评论中,我对其进行了更详细的解释:

  

数据上下文和与数据库的连接已存在。这不是问题。我的问题是,我有一个管理登录,注册等的帐户控制器。当页面加载时,该控制器会被实施。在那个实例中,我也有一个UserManager类的实例。在我的管理控制器中,我想使用UserManager类的那个实例,而不是像我现在所做的那样创建一个新实例。希望这能解释得更好

/ edit2:根据要求提供代码片段。我想要做的是从AccountController类获取UserContext实例并在AdminController类中使用它。我还可以补充说,与数据库的连接工作正常。我可以查询一切。只是我不愿意创建另一个UserContext实例。

AccountController.cs:

[Authorize]
public class AccountController : Controller
{
    public AccountController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new UserContext())))
    {
    }

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        UserManager = userManager;
    }

    public UserManager<ApplicationUser> UserManager { get; private set; }

    //
    // GET: /Account/Login
    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }
    // Additional GET/POST/PUT/DELETE methods

AdminController.cs

/// <summary>The admin controller.</summary>
public class AdminController : Controller
{
    private UserContext userContext = new UserContext();

    public ActionResult Admin()
    {
        return this.View();
    }

    public ActionResult ManageUser()
    {
        var users = this.userContext.Users.ToList();

        return this.PartialView(users);
    }

UserContext.cs

public class UserContext : IdentityDbContext<ApplicationUser>
{
    public UserContext()
        : base("DefaultConnection")
    {

    }
}

的Web.config

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-N44Web-20131104100543.mdf;Initial Catalog=aspnet-N44Web-20131104100543;Integrated Security=True"
  providerName="System.Data.SqlClient" />
</connectionStrings>

2 个答案:

答案 0 :(得分:1)

不同的控制器应具有不同的数据库上下文。 默认情况下,MVC控制器的生命周期等于Request,因此在控制器上的方法完成后,Context不能也不应该使用。

在AdminController的构造函数中实例化上下文,就像在AccountController中一样。

答案 1 :(得分:0)

您可能正在讨论基于数据库表建模的用户模型。 您将使用datacontext来为用户创建用户模型和数据库表之间的连接,这样您就可以创建,更新,删除用户等。

您可以通过Entityframeworks,NHibernate或其他标准ORMS创建数据上下文。

这是核心概念。如果您提供更多信息,我将能够提供更多帮助。