现有数据库上的 AspNet Identity ApplicationDbContext
Posted
技术标签:
【中文标题】现有数据库上的 AspNet Identity ApplicationDbContext【英文标题】:AspNet Identity ApplicationDbContext on existing database 【发布时间】:2018-04-21 10:45:30 【问题描述】:我有一个包含我的应用程序表的现有数据库,我即将使用 MVC5 为我的应用程序构建一个新版本。我决定在我的应用程序中使用 AspNet Identity 框架。
我在创建项目时使用的 Visual Studio 模板添加了一个文件“IdentityModel.cs”和类
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
所以我可以使用如下代码访问表用户、角色和其他 AspNet 身份表:
var context = new ApplicationDbContext();
context.Users.ToList();
由于 Microsoft 给类“ApplicationDbContext”(而不是:IdentityDbContext)命名,我想知道该类是否应该用作与 AspNet Identity 框架无关的所有其余现有表的“访问器”?
如果没有“ApplicationDbContext”类的通用名称,我只会使用我刚刚添加到解决方案中的实体框架项目来访问我的应用程序的其他表,但我想知道什么是“最佳实践”。要使用相同的 AspNet Identity ApplicationDbContext 访问器(以及如何使用?)或使用两个 Db 访问器,一个 AspNet Identity 表和一个用于我为其余表创建的实体框架(Db First)。
对我在单独的 EntityFramework edmx 文件中拥有的所有表、AspNet 标识和所有其余表使用相同的 dbContext 看起来更符合逻辑。如何在一个 dbContext 中同时使用它们?
【问题讨论】:
使用单一上下文。将身份框架表添加到现有上下文或将表添加到生成的上下文。这没什么区别。如果您不喜欢上下文的名称,请重命名它。模板只是生成一个起点,不是正典。 @CraigW。 - 感谢您的评论,我正在使用实体框架 edmx 文件来测试应用程序表。如何使用与 asp.net 身份相同的数据库上下文? 【参考方案1】:AspNet Identity 提供了类似用户管理器的功能,它应该可以解决您的问题。您不需要对真实表进行操作,AspNet Identity 应该涵盖表结构并且应该允许进行高级操作。您的用户模型应该继承 IdentityModel 类,然后您就可以构建自己的自定义模型。
【讨论】:
感谢您的评论。我知道..我试图理解不同的东西,【参考方案2】:听起来您的问题的一部分是,虽然 IdentityFramework
使用 code-first 实体框架,但您没有在应用程序的其余部分使用代码优先,而是使用较旧的 edmx 设计器方法。我不会尝试将两者混为一谈。
此外,因为ApplicationDbContext
继承自IdentityDbContext
,所以我不会管它。基类实现了OnModelCreating
和ValidateEntity
之类的东西。如果你想为 IdentityFramework 使用你的其他上下文,你需要让你的其他上下文继承自 IdentityDbContext
——这是不好的语义,因为它实际上不仅仅是一个身份上下文——或者你需要手动实现这些方法。
然而,将身份框架上下文指向与您的其他实体框架项相同的数据库是很容易的。只需将 ApplicationDbContext
中的 "DefaultConnection"
替换为您用于其他内容的连接字符串的名称即可。
【讨论】:
以上是关于现有数据库上的 AspNet Identity ApplicationDbContext的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft.AspNet.Identity.EntityFramework 上的 vsts 构建失败
Microsoft.AspNet.Identity: UserID用整型数据表示, 而不是GUID
Microsoft.AspNet.Identity 2.0 用账号或者邮件作为登陆方式
Microsoft.AspNet.Identity 的自定义成员身份 - CreateLocalUser 失败