ASP.NET MVC5 - 将用户保留在Oracle数据库中

时间:2015-03-05 13:15:11

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

创建 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,但是使用 ASP.NET Identity 2 + EntityFramework6 逻辑与Oracle数据库(没有深刻改变经典MVC5项目的结构)已经让我很沮丧。

4 个答案:

答案 0 :(得分:6)

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

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

    Gist 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. 重建,就是这样!

  6. 让我知道它是否适合你!

答案 1 :(得分:3)

Andres Bejarano对我很有帮助,但是我想添加一些可以让我节省很多时间的东西。首先确保您可以使用Oracle.ManagedDataAccess.Client连接到您的数据库(我的TNS名称文件出现问题,请参阅OracleConnection.Open is throwing ORA-12541 TNS no listener)。

其次,当我尝试注册用户时,我收到以下错误:

  

没有为ADO.NET提供程序找到具有不变名称“Oracle.ManagedDataAccess.Client”的实体框架提供程序。确保提供程序已在应用程序配置文件的“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

答案 2 :(得分:2)

是的,这是一个古老的问题,但我认为对此说一些有用的东西.Andres Bejarano的答案为我工作但是有一些关于DLL版本的东西。对于Entity Framework 6在VS 2015上,我向MVC项目添加了对以下dll的引用:

  • Oracle.DataAccess.EntityFramework 6.121.2.0
  • Oracle.ManagedDataAccess 4.121.2.0
  • Oracle.managedDataAccess.EntityFramework 6.121.2.0。

在此之后,您需要在web.config文件中编写正确的配置,如下所示。
在Configuration标签的末尾添加:

<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。

答案 3 :(得分:1)

您可以自己实施。这不是不可能的。 有人做过herehere。事情可能会有所改变。

我为nhibernate实现了 AspNet.Identity ,我没有对实体框架的任何引用。 无法向您展示代码,但我基本上遵循了其他人使用RavenDbDappernHibernate所做的事情。

您必须实施:

  • 用户(Microsoft.AspNet.Identity.IUser),
  • 角色(Microsoft.AspNet.Identity.IRole)
  • UserStore(Microsoft.AspNet.Identity.IUserStore)
  • UserManager(Microsoft.AspNet.Identity.UserManager)
  • RolesStore(Microsoft.AspNet.Identity.IRoleStore)
  • RoleManager(Microsoft.AspNet.Identity.RoleManager)