ASP.NET MVC5 - 将用户保留在 Oracle 数据库中
ASP.NET MVC5 - Keeping Users in Oracle Database
创建 ASP.NET MVC5 项目后(目标框架为 .NET 4.5.1,身份验证类型为Individual User Account),那么配置项目以将用户、声明、角色等保存在 Oracle 12c 数据库中的最优雅方法是什么?我的意思是,如何在不改变自动生成的 MVC5 项目结构的情况下将 authorization/authentication 数据保留在 Oracle 中。
我想更改 <defaultConnection>
标记是不够的,应该有另一个 Oracle 实现来替换 Microsoft.AspNet.Identity.EntityFramework
。收集一个答案,告诉你从一开始就一步一步地做什么,模板项目是由 VisualStudio 生成的(即应该将哪些引用添加到项目中;以何种方式 Web.config 文件应该安排吗?应该将 Oracle table 严格命名为 AspNetUsers、AspNetClaims 等,还是我可以将已经存在的 table 名称注入代码端?)
注意:Devart 的 dotConnect for Oracle 不在我的范围内,因为它不是免费产品。我使用 Oracle ManagedDataAccess 进行数据库访问并使用 Entity Framework,但将 ASP.NET Identity 2 + EntityFramework6 逻辑与 Oracle 数据库一起使用(无需深入更改结构经典 MVC5 项目)让我感到沮丧。
你可以自己实现。这并非不可能。
有人做到了here and here。事情可能有点变化。
我已经为 nhibernate 实现了我的 AspNet.Identity,但我没有对 entity framework 的任何引用。
无法向您展示代码,但我基本上遵循了其他人对 RavenDb, Dapper or nHibernate.
所做的事情
您必须实施您的:
- 用户(微软。AspNet.Identity.IUser),
- 角色(微软。AspNet.Identity.IRole)
- UserStore(微软。AspNet.Identity.IUserStore)
- 用户管理器(微软。AspNet.Identity.用户管理器)
- 角色库(微软。AspNet.Identity.IRoleStore)
- 角色管理器(微软。AspNet.Identity.角色管理器)
这对您来说可能有点晚了,但我会保留它以防其他人遇到同样的问题。
所以我终于设法让 Identity 2.0 和 Oracle 一起工作。如果您不想对默认的 IdentityUser 进行任何更改(例如,如果您可以使用 char ID 而不是 int 或 long)并且只想在现有的 table 上使用以下步骤Oracle 架构。
在 Oracle 上创建身份 table。如果需要,您可以更改 table 名称,只需确保包含必要的列以供 Identity 使用。您还可以在应用程序中添加您可能需要的任何额外列(最初在 Devart 上找到的脚本,我将其复制到要点以防 URL 中断):
要点here
如果您使用的是 EDMX 文件,则需要添加一个新的连接字符串,因为自动生成的连接字符串不起作用,您需要一个标准的连接字符串。尝试遵循此模板:
<add name="IdentityContext" connectionString="Data Source=localhost:1521/xe;PASSWORD=password;USER ID=username;" providerName="Oracle.ManagedDataAccess.Client" />
告诉您的 ApplicationDbContext 使用您的新 connectionString
public ApplicationDbContext()
: base("IdentityContext", throwIfV1Schema: false)
{
}
告诉 Identity 使用您现有的模式和 tables。在 IdentityModels.cs:
中找到的 ApplicationDbContext 定义中添加此方法
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder); // MUST go first.
modelBuilder.HasDefaultSchema("YOUR_SCHEMA"); // Use uppercase!
modelBuilder.Entity<ApplicationUser>().ToTable("AspNetUsers");
modelBuilder.Entity<IdentityRole>().ToTable("AspNetRoles");
modelBuilder.Entity<IdentityUserRole>().ToTable("AspNetUserRoles");
modelBuilder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims");
modelBuilder.Entity<IdentityUserLogin>().ToTable("AspNetUserLogins");
}
重建就是这样!
让我知道它是否适合你!
Andres Bejarano 为我工作得很好,但我想添加一些可以节省我很多时间的东西。首先确保您可以使用 Oracle.ManagedDataAccess.Client 连接到您的数据库(我的 TNS 名称文件有问题,请参阅 OracleConnection.Open is throwing ORA-12541 TNS no listener)。
其次,我在尝试注册用户时遇到以下错误:
No Entity Framework provider found for the ADO.NET provider with invariant name 'Oracle.ManagedDataAccess.Client'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
这是因为我没有安装所有正确的 Nuget 包 and/or 我搞砸了 web.config。
确保安装了 ODAC http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html
如果您 uninstall/reinstall 按顺序安装以下 Nuget 包。你应该绕过这个错误:
- 卸载包Oracle.ManagedDataAccess.EntityFramework
- 卸载包Oracle.ManagedDataAccess
- UnInstall-Package EntityFramework - 版本 6.1.1
- 安装包 EntityFramework - 版本 6.1.1
- 安装包Oracle.ManagedDataAccess
- 安装包Oracle.ManagedDataAccess.EntityFramework
是的,这是一个老问题,但我认为说一些关于 this.The Andres Bejarano 的回答对我有用但有一些关于 dll 版本的事情是有用的。对于 Entity Framework 6 在 VS 2015 上,我向 MVC 项目添加了对以下 dll 的引用:
- Oracle.DataAccess.EntityFramework6.121.2.0
- Oracle.ManagedDataAccess 4.121.2.0
- Oracle.managedDataAccess.EntityFramework6.121.2.0。
之后你需要在 web.config 文件中写入正确的配置,如下所示。
在配置标签的末尾添加:
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.ManagedDataAccess.Client" />
<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories> </system.data>
在提供商部分添加:
<provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
当然,在 connectionstrings 部分中,您需要为 oracle 添加连接字符串:类似于:
<add name="IdentityContext" connectionString="Data Source=YOURDB;User Id=YOURUSER;Password=YOURPASSWORD;"
providerName="Oracle.ManagedDataAccess.Client" />
使用此配置,Andres Bejorano 所说的更改对我有效,而且不会影响 Nuget。
创建 ASP.NET MVC5 项目后(目标框架为 .NET 4.5.1,身份验证类型为Individual User Account),那么配置项目以将用户、声明、角色等保存在 Oracle 12c 数据库中的最优雅方法是什么?我的意思是,如何在不改变自动生成的 MVC5 项目结构的情况下将 authorization/authentication 数据保留在 Oracle 中。
我想更改 <defaultConnection>
标记是不够的,应该有另一个 Oracle 实现来替换 Microsoft.AspNet.Identity.EntityFramework
。收集一个答案,告诉你从一开始就一步一步地做什么,模板项目是由 VisualStudio 生成的(即应该将哪些引用添加到项目中;以何种方式 Web.config 文件应该安排吗?应该将 Oracle table 严格命名为 AspNetUsers、AspNetClaims 等,还是我可以将已经存在的 table 名称注入代码端?)
注意:Devart 的 dotConnect for Oracle 不在我的范围内,因为它不是免费产品。我使用 Oracle ManagedDataAccess 进行数据库访问并使用 Entity Framework,但将 ASP.NET Identity 2 + EntityFramework6 逻辑与 Oracle 数据库一起使用(无需深入更改结构经典 MVC5 项目)让我感到沮丧。
你可以自己实现。这并非不可能。 有人做到了here and here。事情可能有点变化。
我已经为 nhibernate 实现了我的 AspNet.Identity,但我没有对 entity framework 的任何引用。 无法向您展示代码,但我基本上遵循了其他人对 RavenDb, Dapper or nHibernate.
所做的事情您必须实施您的:
- 用户(微软。AspNet.Identity.IUser),
- 角色(微软。AspNet.Identity.IRole)
- UserStore(微软。AspNet.Identity.IUserStore)
- 用户管理器(微软。AspNet.Identity.用户管理器)
- 角色库(微软。AspNet.Identity.IRoleStore)
- 角色管理器(微软。AspNet.Identity.角色管理器)
这对您来说可能有点晚了,但我会保留它以防其他人遇到同样的问题。 所以我终于设法让 Identity 2.0 和 Oracle 一起工作。如果您不想对默认的 IdentityUser 进行任何更改(例如,如果您可以使用 char ID 而不是 int 或 long)并且只想在现有的 table 上使用以下步骤Oracle 架构。
在 Oracle 上创建身份 table。如果需要,您可以更改 table 名称,只需确保包含必要的列以供 Identity 使用。您还可以在应用程序中添加您可能需要的任何额外列(最初在 Devart 上找到的脚本,我将其复制到要点以防 URL 中断):
要点here
如果您使用的是 EDMX 文件,则需要添加一个新的连接字符串,因为自动生成的连接字符串不起作用,您需要一个标准的连接字符串。尝试遵循此模板:
<add name="IdentityContext" connectionString="Data Source=localhost:1521/xe;PASSWORD=password;USER ID=username;" providerName="Oracle.ManagedDataAccess.Client" />
告诉您的 ApplicationDbContext 使用您的新 connectionString
public ApplicationDbContext() : base("IdentityContext", throwIfV1Schema: false) { }
告诉 Identity 使用您现有的模式和 tables。在 IdentityModels.cs:
中找到的 ApplicationDbContext 定义中添加此方法protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // MUST go first. modelBuilder.HasDefaultSchema("YOUR_SCHEMA"); // Use uppercase! modelBuilder.Entity<ApplicationUser>().ToTable("AspNetUsers"); modelBuilder.Entity<IdentityRole>().ToTable("AspNetRoles"); modelBuilder.Entity<IdentityUserRole>().ToTable("AspNetUserRoles"); modelBuilder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims"); modelBuilder.Entity<IdentityUserLogin>().ToTable("AspNetUserLogins"); }
重建就是这样!
让我知道它是否适合你!
Andres Bejarano 为我工作得很好,但我想添加一些可以节省我很多时间的东西。首先确保您可以使用 Oracle.ManagedDataAccess.Client 连接到您的数据库(我的 TNS 名称文件有问题,请参阅 OracleConnection.Open is throwing ORA-12541 TNS no listener)。
其次,我在尝试注册用户时遇到以下错误:
No Entity Framework provider found for the ADO.NET provider with invariant name 'Oracle.ManagedDataAccess.Client'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
这是因为我没有安装所有正确的 Nuget 包 and/or 我搞砸了 web.config。
确保安装了 ODAC http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html
如果您 uninstall/reinstall 按顺序安装以下 Nuget 包。你应该绕过这个错误:
- 卸载包Oracle.ManagedDataAccess.EntityFramework
- 卸载包Oracle.ManagedDataAccess
- UnInstall-Package EntityFramework - 版本 6.1.1
- 安装包 EntityFramework - 版本 6.1.1
- 安装包Oracle.ManagedDataAccess
- 安装包Oracle.ManagedDataAccess.EntityFramework
是的,这是一个老问题,但我认为说一些关于 this.The Andres Bejarano 的回答对我有用但有一些关于 dll 版本的事情是有用的。对于 Entity Framework 6 在 VS 2015 上,我向 MVC 项目添加了对以下 dll 的引用:
- Oracle.DataAccess.EntityFramework6.121.2.0
- Oracle.ManagedDataAccess 4.121.2.0
- Oracle.managedDataAccess.EntityFramework6.121.2.0。
之后你需要在 web.config 文件中写入正确的配置,如下所示。
在配置标签的末尾添加:
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.ManagedDataAccess.Client" />
<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories> </system.data>
在提供商部分添加:
<provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
当然,在 connectionstrings 部分中,您需要为 oracle 添加连接字符串:类似于:
<add name="IdentityContext" connectionString="Data Source=YOURDB;User Id=YOURUSER;Password=YOURPASSWORD;"
providerName="Oracle.ManagedDataAccess.Client" />
使用此配置,Andres Bejorano 所说的更改对我有效,而且不会影响 Nuget。