ASP.NET MVC5 - 将用户保留在 Oracle 数据库中
Posted
技术标签:
【中文标题】ASP.NET MVC5 - 将用户保留在 Oracle 数据库中【英文标题】:ASP.NET MVC5 - Keeping Users in Oracle Database 【发布时间】:2015-05-06 20:57:50 【问题描述】:创建 ASP.NET MVC5 项目后(目标框架为 .NET 4.5.1,身份验证类型为个人用户帐户 ),那么配置项目以使其将用户、声明、角色等保存在 Oracle 12c 数据库中的最优雅的方法是什么?我的意思是,如何在不破坏自动生成的 MVC5 项目结构的情况下将授权/身份验证数据保留在 Oracle 中。
我猜更改<defaultConnection>
标记是不够的,应该有另一个Oracle 实现来替换Microsoft.AspNet.Identity.EntityFramework
。从一开始就收集一个告诉你要做什么的答案会非常有帮助,模板项目是由 VisualStudio 生成的(即应该将哪些引用添加到项目中;应该以哪种方式添加 Web.config 文件)安排好了吗?Oracle 表应该严格命名为 AspNetUsers、AspNetClaims 等,还是我可以将已经存在的表名注入代码端?)
注意: Devart 的 dotConnect for Oracle 超出了我的范围,因为它不是免费产品。我使用 Oracle ManagedDataAccess 进行数据库访问并使用 Entity Framework,但是使用 Oracle 数据库的 ASP.NET Identity 2 + EntityFramework6 逻辑(没有深刻改变经典 MVC5 项目的结构)已经令我沮丧。
【问题讨论】:
我也陷入了这个问题。您找到任何解决方案了吗?请您分享您的解决方案吗? 你试过我的解决方案了吗? 【参考方案1】:这对您来说可能有点晚了,但我会留下它,以防其他人遇到同样的问题。 所以我终于设法让 Identity 2.0 和 Oracle 一起工作。如果您不想对默认 IdentityUser 进行任何更改(例如,如果您可以使用 char ID 而不是 int 或 long)并且只想要现有 Oracle 架构上的表,则以下步骤有效。
在 Oracle 上创建身份表。您可以根据需要更改表名,只需确保包含 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 使用您现有的架构和表。在 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 我尝试了你提到的所有步骤,但 OnModelCreating 方法永远不会被解雇。因此,当我运行应用程序The entity type ApplicationUser is not part of the model for the current context.
时,我不断收到此错误消息
@Andres 我尝试了你提到的所有步骤,但 OnModelCreating 方法永远不会被触发。因此,当我运行应用程序时,我不断收到此错误消息实体类型 ApplicationUser 不是当前上下文模型的一部分。【参考方案2】:
Andres Bejarano 非常适合我,但我想补充一些可以节省我很多时间的东西。首先确保您可以使用 Oracle.ManagedDataAccess.Client 连接到您的数据库(我的 TNS 名称文件有问题,请参阅OracleConnection.Open is throwing ORA-12541 TNS no listener)。
其次,我在尝试注册用户时遇到以下错误:
找不到具有不变名称“Oracle.ManagedDataAccess.Client”的 ADO.NET 提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分注册。请参阅http://go.microsoft.com/fwlink/?LinkId=260882 了解更多信息。
这是因为我没有安装所有正确的 Nuget 包和/或我搞砸了 web.config。
确保您已安装 ODAC http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html
如果您按顺序卸载/重新安装以下 Nuget 包。你应该绕过这个错误:
-
UnInstall-Package Oracle.ManagedDataAccess.EntityFramework
UnInstall-Package Oracle.ManagedDataAccess
UnInstall-Package EntityFramework -Version 6.1.1
Install-Package EntityFramework -Version 6.1.1
安装包 Oracle.ManagedDataAccess
安装包 Oracle.ManagedDataAccess.EntityFramework
【讨论】:
Oracle ManagedDataAccess 的事情确实值得注意——尤其是在设置时【参考方案3】:是的,这是一个老问题,但我认为对此说一些事情很有用。Andres Bejarano 的回答对我有用,但有一些关于 dll 版本的事情。对于 VS 2015 上的实体框架 6,我在 MVC 项目中添加了对以下 dll 的引用:
Oracle.DataAccess.EntityFramework 6.121.2.0 Oracle.ManagedDataAccess 4.121.2.0 Oracle.managedDataAccess.EntityFramework 6.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" />
当然,在连接字符串部分,您需要为 oracle 放置连接字符串:类似于:
<add name="IdentityContext" connectionString="Data Source=YOURDB;User Id=YOURUSER;Password=YOURPASSWORD;"
providerName="Oracle.ManagedDataAccess.Client" />
通过这种配置,Andres Bejorano 所说的更改对我有用,而不会弄乱 Nuget。
【讨论】:
【参考方案4】:您可以自己实现它。这并非不可能。 有人已经做到了here 和here。情况可能有所改变。
我已经为 nhibernate 实现了我的 AspNet.Identity,并且我没有对实体框架的任何引用。 无法向您显示代码,但我基本上遵循了其他人对 RavenDb、Dapper 或 nHibernate 所做的操作。
你必须实现你的:
用户(Microsoft.AspNet.Identity.IUser), 角色 (Microsoft.AspNet.Identity.IRole) 用户存储 (Microsoft.AspNet.Identity.IUserStore) 用户管理器 (Microsoft.AspNet.Identity.UserManager) RolesStore (Microsoft.AspNet.Identity.IRoleStore) RoleManager (Microsoft.AspNet.Identity.RoleManager)【讨论】:
以上是关于ASP.NET MVC5 - 将用户保留在 Oracle 数据库中的主要内容,如果未能解决你的问题,请参考以下文章
如何将 MVC5 RedirectResult () 重定向到 Asp.net 中的整页?