将mvc5帐户控制器代码移动到单独的项目中

时间:2013-10-21 08:29:24

标签: asp.net-mvc entity-framework asp.net-mvc-5 asp.net-identity

我有一个包含WebApi2,MVC5& DAL项目(所有RTM)。

我想使用现在已经出炉的新会员位,但我不喜欢帐户控制器中的所有帐户内容。执行文件新项目(asp.net)将所有会员资料都耦合到帐户控制器。

在我的DAL中我使用EF6,因为我喜欢代码优先的理想,因为它适合我想要做的事情。我正在尝试使用帐户控制器代码并将其移动到我的单独项目中。

我在DAL中的上下文很简单(取自MVC网站)

public class ApplicationUser : IdentityUser
{
    //a user can belong to multiple stores
    public virtual ICollection<StoreModel> Stores { get; set; }
}


public class DataContext : IdentityDbContext<ApplicationUser>
{
    public DataContext(): base("name=DefaultConnection")
    {
    }
    public DbSet<Business> Businesses { get; set; }
    public DbSet<ConsumerModel> Consumers { get; set; }
    public DbSet<StoreModel> Stores { get; set; }
}

从我的登录操作中的帐户控制器我尝试

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
  if (ModelState.IsValid)
     {
      var user = await UserManager.FindAsync(model.UserName, model.Password);
       if (user != null)
       {

它会导致User.FindAsync

出错
  

实体类型ApplicationUser不是该模型的一部分   目前的背景。

我需要做些什么才能在当前环境中使用ApplicationUser?

4 个答案:

答案 0 :(得分:1)

我做了类似的事情。为了实现关注点的分离,我从我的存储库中获取UserManager,然后在Presentation层中使用它。存储库在内部使用内部LoginDbContext从UserStore创建UserManager。这样,DbContext和Store就与控制器分开了。

答案 1 :(得分:0)

您需要创建一个UserManager,其中包含接收dbcontext

的用户界面
public UserController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
    {
    }


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

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

答案 2 :(得分:0)

如果使用VisualStudio模板创建WebApi项目或somthing,

请仔细查看Startup.Auth.cs文件中的UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));

您可能会错过(new ApplicationDbContext())部分。默认情况下,它具有空参数。

答案 3 :(得分:-2)

我相信这会有所帮助。我是MVC5的新手,我一直想将我的模型层与MVC网站分开,主要是因为我想我想在各个项目中共享模型。我无法跟踪我在各种帮助网站上找到的所有编程mumbo jumbo。我总是遇到很多错误,我无法用有限的知识解决这些错误。但是,我找到了一种简单的方法将我的ApplicationDbContext从我的MVC5模型中移出,几乎没有任何错误。所有工作都由Microsoft提供的向导完成。我想与大家分享我的小发现。这就是你所做的(一步一步):

1.  Create a MVC5 project with authentication. Call it ModelProject.
2.  Exclude everything from the project except
    a.  Properties
    b.  References
    c.  Models
    d.  packages.config

3.  The ModelProject will hold all your models (even ApplicationDbContext.) Rebuild it.
4.  Now, create a new MVC5 project with authentication. Call this Mvc5Project
5.  Import the ModelProject project into Mvc5Project .
6.  Wire the ModelProject into this project i.e. link in the reference.
7.  Exclude the following from the MVc5Project from the Models folder
    a.  AccountViewModels.cs
    b.  IdentityModels.cs
    c.  ManageViewModels.cs
8.  If you rebuild now, you will get a bunch of errors. Just go to the errors and resolve them using the right click method to get the new namespace from ModelProject. The namespace will show if you have wired the project in correctly.
9.  Also, dont forget to go to View/Manage and Views/Account of Mvc5Project and change the models in there to the new location otherwise you will get some weird cryptic errors.

就是这样!现在你有一个项目,模型全部分开(包括applicationDbContext) - 并且没有错误!!祝你好运!