Entity Framework Core 自动在 Oracle 数据库中插入双引号

问题描述 投票:0回答:2

我正在开发一个 ASP.NET Core 6 MVC Web 应用程序,我想使用集成的身份平台来处理用户角色和身份验证。

由于此 Web 应用程序必须是跨数据库的,因此我需要在 Oracle 自治数据库上使其工作。因此,我从 NuGet 安装了

Oracle.EntityFrameworkCore
包,并切换到
UseOracle
文件的
ConfigureServices
方法中的
Startup.cs
方法。

services.AddDbContext<ApplicationDBContext>(options =>
        {
            // options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
            options.UseOracle(Configuration.GetConnectionString("OracleConnection"))
        });

可以建立连接,但问题是:在准备

UserManager
并在
Startup.cs
中创建用户角色时,EF Core 调用的任何标准方法实际上都会执行在对象名称周围使用双引号的查询,例如做这个

private async Task CreateRoles(IServiceProvider serviceProvider)
{
   //Custom roles 
   var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

   string[] roleNames = { "Admin" };

   IdentityResult roleResult;

   foreach (var roleName in roleNames)
   {
       var roleExist = await RoleManager.RoleExistsAsync(roleName);

       if (!roleExist)
       {
           // create the roles and seed them to the database: Question 1
           roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
       }
   }

   await CreateUser(serviceProvider, "Admin");
}

此代码执行此查询:

SELECT "a"."Id", "a"."ConcurrencyStamp", "a"."Name", "a"."NormalizedName"
FROM "AspNetRoles" "a"
WHERE "a"."NormalizedName" = :normalizedName_0
FETCH FIRST 1 ROWS ONLY

失败了。

它搜索一个

"AspNetRoles"
表,双引号意味着它完全搜索该表,因此它不存在,因为Oracle自治数据库中的表都是大写的,并且不能是CamelCase。我收到错误 ORA-00942。

我无法弄清楚如何使 EF Core NOT 使用双引号而不恢复到 DevArt Oracle 包。

我该如何解决这个问题?

c# oracle .net-core entity-framework-core .net-6.0
2个回答
0
投票

最后我明白问题不仅仅在于

Identity Provider
表。

所以我实现了

linq2db
linqToDb.Identity
并通过放置

使其工作
OracleTools.DontEscapeLowercaseIdentifiers = false;

ConfigureServices
Startup.cs
方法中。

快速说明:

LinqToDb.Identity
NuGet
软件包停留在 2021 年 5 月的版本上,由于
Linq2DB
类中缺少对
this
(例如
this.GetTable
)的各种引用,因此与最近的
IdentityDataConnection
软件包不兼容,因此您不妨下载源代码并将其包含在您的项目中(或从中创建一个类库)并修复该类。

回购链接:https://github.com/linq2db/LinqToDB.Identity


0
投票

这是因为Oracle区分大小写 您必须将所有列重命名为大写或使用以下属性:

[Column("PRXID")]

public int prxId { get; set; }

© www.soinside.com 2019 - 2024. All rights reserved.