首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >替换自动创建的ApplicationDbContext

替换自动创建的ApplicationDbContext
EN

Stack Overflow用户
提问于 2015-01-18 13:21:15
回答 2查看 18.4K关注 0票数 8

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

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

代码语言:javascript
运行
复制
private ApplicationDbContext db = new ApplicationDbContext();

在控制器操作中,我会执行如下操作:

代码语言:javascript
运行
复制
return View(db.Trains.ToList());

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

  1. 在整个应用程序中只使用一个数据库上下文可以吗,就像我现在所做的那样?
  2. 我可以用我自己的ApplicationDbContext替换在IdentityModels.cs中定义的类吗?
  3. ApplicationDbContext类是从IdentityDbContext<ApplicationUser>派生的,这是否意味着我应该为Visual提供的用户身份验证内容和我自己的代码分离数据库上下文?

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

谁知道呢,我可能想错了。每个人似乎都有自己喜欢的方法来处理这个问题。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-18 15:31:04

在整个应用程序中只使用一个数据库上下文可以吗,就像我现在所做的那样?

  • 如果您决定直接从UI层(这是一个单独的讨论)访问DB,这是可以的,因为ApplicationDbContext是控制器的私有字段,控制器是根据请求创建和释放的-- ApplicationDbContext将根据请求被创建和释放。

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

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

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

会起作用的。您仍然需要确保ApplicationUser是自定义上下文中的一个实体。当然,您也可以重写/替换ApplicationUser

ApplicationDbContext类是从IdentityDbContext派生的,这是否意味着我应该为Visual提供的用户身份验证内容和我自己的代码分离数据库上下文?

默认情况下,Asp.Net标识将为您和配置为使用此数据库的ApplicationDbContext生成新的数据库。您也可以将您的身份验证相关实体存储在任何其他数据库中,您只需确保所有相关表都是there.You,就可以扩展此数据库以包括您在应用程序中使用的其他表,这样您就可以到处使用相同的上下文了。

P.S: ApplicationDbContext不必实现IdentityDbContext<ApplicationUser>,扩展默认的DbContext也能工作(如果您已经生成了Db,则必须更新它\use代码迁移才能工作):

代码语言:javascript
运行
复制
 public class ApplicationDbContext : DbContext 
  {
     public ApplicationDbContext()
         : base("DefaultConnection")
     {
     }

     public static ApplicationDbContext Create()
     {
         return new ApplicationDbContext();
     } 
  }
票数 8
EN

Stack Overflow用户

发布于 2015-06-25 00:20:24

我认为您希望为登录身份验证创建自己的自定义身份验证数据库。你需要一步一步地遵循给定的指令。1)您需要创建自己的类来实现自定义身份验证。例如,我正在创建以下学生类,.You可以在MVC中的模型部分创建这个类。

代码语言:javascript
运行
复制
class student{
public int rollno{get;set;}
public string firstName{get;set;}
public string lastName{get;set;}

2)现在,您将使用identityDbContext为学生类创建自己的dbcontext。您可以像这样在App_Start部分创建这个类。

代码语言:javascript
运行
复制
public class ApplicationDbContext : IdentityDbContext<student>
    {
        public ApplicationDbContext() : base()
        {

        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }

3)现在您可以在控制器中使用它,如下所示

代码语言:javascript
运行
复制
public class HomeController : Controller
    {
        // GET: Home
        public async Task<ActionResult> Index()
        {
            var context = new ApplicationDbContext(); // DefaultConnection
            var store = new UserStore<student>(context);
            var manager = new UserManager<student>(store);
            var signInManager = new SignInManager<student, string>(manager,
                HttpContext.GetOwinContext().Authentication);
            var username  = "Edward";
            var email = "abc@gmail.com";
            var password = "Your password";
            var user = await manager.FindByEmailAsync(email);

            if (user == null)
            {
                user = new student                    {
                    UserName = username,//username ,Email are getting from identityDbContext and the other three RollNO,FirstName and LastName are your own Custom members.so like this you can extend your any kind of data you like add or extend with IdentityDbContext.
                    Email = email,
                    RollNo = "15",
                    FirstName = "David",
                    LastName = "Kandel"
                };

                await manager.CreateAsync(user, password);
            }
            else
            {
                var result = await signInManager.PasswordSignInAsync(user.UserName, password, true, false);

                if (result == SignInStatus.Success)
                {
                    return Content("Hello, " +user.rollno + ""  + user.FirstName + " " + user.LastName);
                }

                                }


            return Content("Hello, Index");
        }
    }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28010113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档