替换自动创建的ApplicationDbContext

Joh*_*ean 7 c# asp.net asp.net-mvc entity-framework

我应该在免费声明之前说这是我对ASP.NET开发的新手并不真正理解数据库上下文,尽管花费了最后一小时阅读文档.当我构建我的ASP.NET MVC 5应用程序时,我选择了单独的用户帐户身份验证.Visual Studio创建了一个名为的文件IdentityModels.cs,并在其中定义了一个ApplicationUser类和一个ApplicationDbContext类.

我做了一些开发工作,我的CRUD控制器ApplicationDbContext用来与数据库通信,在每个控制器上都有这个私有属性:

private ApplicationDbContext db = new ApplicationDbContext();
Run Code Online (Sandbox Code Playgroud)

在控制器操作中,我然后执行以下操作:

return View(db.Trains.ToList());
Run Code Online (Sandbox Code Playgroud)

我想整理这个数据库上下文,但我需要先了解它.我的主要问题是:

  1. 是否可以仅为我的整个应用程序使用一个数据库上下文,就像我现在正在做的那样?
  2. 我可以用自己的ApplicationDbContext类替换定义的类IdentityModels.cs吗?
  3. ApplicationDbContext类从派生IdentityDbContext<ApplicationUser>,这是否意味着我应该有一个由Visual Studio提供我的用户身份验证的东西,我自己的代码单独的数据库环境?

我认为我的最终目标是使用我自己的数据库上下文,DatabaseContext该上下文被用于我的所有控制器继承的基本控制器中.然后我只有一个地方实例化数据库上下文,而不是在每个控制器中.

谁知道,我可能在想这个错误的方法.似乎每个人都有自己喜欢的方式来解决这个问题.

谢谢!

Ale*_*rt. 8

是否可以仅为我的整个应用程序使用一个数据库上下文,就像我现在正在做的那样?

  • 如果您决定直接从UI层访问数据库(这是一个单独的讨论),那么由于它是ApplicationDbContext控制器的私有字段,并且每个请求创建和处理控制器 - ApplicationDbContext将被创建和处理根据要求.

我可以用自己的身份替换IdentityModels.cs中定义的ApplicationDbContext类吗?

  • 你绝对可以做到.它用于创建一个在构造函数中作为参数UserStore接收DbContext的内容

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(new CustomDbContext("connection")));

将工作.您仍然必须确保它ApplicationUser是自定义上下文中的实体.当然你也可以覆盖/替换ApplicationUser.

ApplicationDbContext类派生自IdentityDbContext,这是否意味着我应该为Visual Studio提供的用户身份验证提供单独的数据库上下文,以及我自己的代码?

默认情况下,Asp.Net Identity会为您生成新的数据库,并ApplicationDbContext配置为使用此数据库.您可以将您的身份验证相关实体存储在任何其他数据库中,您只需要确保所有相关表都在那里.您还可以扩展此数据库以包括您在应用程序中使用的其他表,以便您可以全部使用相同的上下文.

PS: ApplicationDbContext不必实现IdentityDbContext<ApplicationUser>,扩展默认也DbContext可以工作(如果已经生成了Db,则必须更新它\使用代码迁移以使以下工作):

 public class ApplicationDbContext : DbContext 
  {
     public ApplicationDbContext()
         : base("DefaultConnection")
     {
     }

     public static ApplicationDbContext Create()
     {
         return new ApplicationDbContext();
     } 
  }
Run Code Online (Sandbox Code Playgroud)