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 中的整页?

如何在 OWIN ASP.NET MVC5 中注销用户

ASP.NET MVC5 实现 SQL 查询工具

ASP.NET MVC5 在用户注册时自动填充第二个表

如何将类的对象发送到数据库以存储在 ASP.NET MVC5 中?

如何在 Asp.Net MVC5 中使用 Ajax 将数据库更改保存到拖放列表