【问题标题】:ASP.NET MVC5 - Keeping Users in Oracle DatabaseASP.NET MVC5 - 将用户保留在 Oracle 数据库中
【发布时间】: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 项目的结构)已经令我沮丧。

【问题讨论】:

  • 我也陷入了这个问题。您找到任何解决方案了吗?请您分享您的解决方案吗?
  • 你试过我的解决方案了吗?

标签: database oracle asp.net-mvc-5 entity-framework-6 asp.net-identity-2


【解决方案1】:

这对您来说可能有点晚了,但我会留下它,以防其他人遇到同样的问题。 所以我终于设法让 Identity 2.0 和 Oracle 一起工作。如果您不想对默认 IdentityUser 进行任何更改(例如,如果您可以使用 char ID 而不是 int 或 long)并且只想要现有 Oracle 架构上的表,则以下步骤有效。

  1. 在 Oracle 上创建身份表。您可以根据需要更改表名,只需确保包含 Identity 使用它所需的列。您还可以在您的应用程序中添加您可能需要的任何额外列(最初在 Devart 上找到的脚本,我将其复制到一个要点以防 URL 中断):

    要点here

  2. 如果您使用的是 EDMX 文件,则需要添加一个新的连接字符串,因为自动生成的连接字符串不起作用,您需要一个标准连接字符串。尝试遵循此模板:

    <add name="IdentityContext" connectionString="Data Source=localhost:1521/xe;PASSWORD=password;USER ID=username;" providerName="Oracle.ManagedDataAccess.Client" />

  3. 告诉您的 ApplicationDbContext 使用您的新 connectionString

    public ApplicationDbContext()
        : base("IdentityContext", throwIfV1Schema: false)
    {
    }
    
  4. 告诉 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");
    }
    
  5. 重建就是这样!

让我知道它是否适合你!

【讨论】:

  • 节省了我的时间.. 像魅力一样工作
  • @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 包。你应该绕过这个错误:

  1. UnInstall-Package Oracle.ManagedDataAccess.EntityFramework
  2. UnInstall-Package Oracle.ManagedDataAccess
  3. UnInstall-Package EntityFramework -Version 6.1.1
  4. Install-Package EntityFramework -Version 6.1.1
  5. 安装包 Oracle.ManagedDataAccess
  6. 安装包 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】:

    您可以自己实现它。这并非不可能。 有人已经做到了herehere。情况可能有所改变。

    我已经为 nhibernate 实现了我的 AspNet.Identity,并且我没有对实体框架的任何引用。 无法向您显示代码,但我基本上遵循了其他人对 RavenDbDappernHibernate 所做的操作。

    你必须实现你的:

    • 用户(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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      相关资源
      最近更新 更多