创建 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项目的结构)已经让我很沮丧。
答案 0 :(得分:6)
这对你来说可能有点晚了,但我会留下它以防万一其他人遇到同样的问题。 所以我终于设法使Identity 2.0和Oracle协同工作。如果您不想对默认的IdentityUser进行任何更改,则以下步骤可以正常工作(例如,如果您使用char ID而不是int或long,那么只需要现有Oracle上的表)架构。
在Oracle上创建标识表。您可以根据需要更改表名,只需确保包含必要的Identity列以使用它。您还可以在应用程序中添加您可能需要的任何额外列(最初在Devart上找到的脚本,我将其复制到gist,以防URL中断):
Gist 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");
}
重建,就是这样!
让我知道它是否适合你!
答案 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软件包。你应该绕过这个错误:
答案 2 :(得分:2)
是的,这是一个古老的问题,但我认为对此说一些有用的东西.Andres Bejarano的答案为我工作但是有一些关于DLL版本的东西。对于Entity Framework 6在VS 2015上,我向MVC项目添加了对以下dll的引用:
在此之后,您需要在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)
您可以自己实施。这不是不可能的。 有人做过here和here。事情可能会有所改变。
我为nhibernate实现了 AspNet.Identity ,我没有对实体框架的任何引用。 无法向您展示代码,但我基本上遵循了其他人使用RavenDb,Dapper或nHibernate所做的事情。
您必须实施: