ASP.NET MVC 5在Oracle数据库中存储标识用户

And*_*ano 3 asp.net oracle asp.net-mvc asp.net-identity

我是开发ASP.NET应用程序的新手,我开始了一个新项目,我正在使用带有ODP和OLAC插件的Oracle DB.我设置了连接字符串,我可以在Server Explorer下看到数据库.

现在我希望Identity用户也可以存储在我的数据库中,但我现在无法找到它们存储的位置.app_data文件夹为空,任何地方都没有.mdf文件,我的连接字符串是Oracle连接字符串; 但是当我设置IdentityDBContext以使用我自己的连接字符串时,我得到一个错误,说"实体类型ApplicationUser不是当前上下文模型的一部分".我正在使用数据库优先方法:

这是我的数据库上下文的自动生成代码:

public partial class ActivoContext : DbContext
{
    public ActivoContext()
        : base("name=ActivoContext")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }
......
Run Code Online (Sandbox Code Playgroud)

这是项目生成的身份代码,我刚刚更改了连接字符串:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("name=ActivoContext", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}
Run Code Online (Sandbox Code Playgroud)

web.config文件:

<connectionStrings>
  <add name="ActivoContext" connectionString="metadata=res://*/Activo.csdl|res://*/Activo.ssdl|res://*/Activo.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;DATA SOURCE=localhost:1521/xe;PASSWORD=activos;USER ID=ACTIVOS&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

编辑 所以我意识到问题是使用相同的连接字符串有两个不同的上下文.因此,只显示一个而另一个不起作用:自动生成的db-first ActivoContext显示而ApplicationDbContext不显示.我应该如何合并这两个或让它们一起工作?我无法修改DbContext导致其自动生成...

And*_*ano 8

最后让Identity 2.0与我的Oracle DB一起使用.这是我做的:

如果您不想对默认的IdentityUser进行任何更改,则以下步骤有效(例如,如果您可以使用char ID而不是int或long),并且只需要现有Oracle架构上的表.

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

点击这里

2)如果您正在使用EDMX文件,则需要添加新的连接字符串,因为自动生成的连接字符串将无法工作,您需要一个标准的连接字符串.请尝试以下模板:

<add name="IdentityContext" connectionString="Data Source=localhost:1521/xe;PASSWORD=password;USER ID=username;" providerName="Oracle.ManagedDataAccess.Client" />
Run Code Online (Sandbox Code Playgroud)

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

public ApplicationDbContext()
: base("IdentityContext", throwIfV1Schema: false)
{
}
Run Code Online (Sandbox Code Playgroud)

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");
}
Run Code Online (Sandbox Code Playgroud)

5)重建,就是这样!