查询 EF Core 8 Code First 创建的 Oracle 表时避免使用双引号

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

背景

我有一个这样的表格模型:

public class Book
{
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; } = default!;
    public string Author { get; set; } = default!;
    public int Pages { get; set; } = default!;
}

如果我运行添加迁移命令

dotnet ef migrations add AddBooks -p .\MyApplication.Infrastructure\ -s .\MyApplication.API\

我得到了预期的结果:

migrationBuilder.CreateTable(
    name: "Books",
    columns: table => new
    {
        Id = table.Column<Guid>(type: "RAW(16)", nullable: false),
        Name = table.Column<string>(type: "NVARCHAR2(2000)", nullable: false),
        Author = table.Column<string>(type: "NVARCHAR2(2000)", nullable: false),
        Pages = table.Column<int>(type: "NUMBER(10)", nullable: false)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Books", x => x.Id);
    });

如果我随后更新数据库:

dotnet ef database update -p .\MyApplication.Infrastructure\ -s .\MyApplication.API\

表已按指定创建:

enter image description here

哪里出了问题

我期望看到的是我可以像这样查询我的表:

select * from Books b

但是它指出“表或视图不存在”。

如果我生成查询,它会像这样执行:

select * from "Books" b

这工作正常,但与所有其他表的设置方式不同。

我的问题

如何在不需要那些额外的双精度的情况下生成我的表 报价?

oracle entity-framework .net-core ef-code-first plsqldeveloper
1个回答
0
投票

Oracle 区分大小写。但是,默认行为是将所有未加引号的标识符转换为大写,以便它看起来不区分大小写。因此:

select * from Books
select * from books
select * from BoOkS
select * from BOOKS

都会从名为

BOOKS
(大写)的表中选择并且是等效的。

带引号的标识符用于强制标识符区分大小写。因此:

select * from "Books"
select * from "books"
select * from "BoOkS"
select * from "BOOKS"

将从四个不同的表中进行选择 - 分别是

Books
books
BoOkS
BOOKS
,并且只有最后一个查询相当于使用不带引号的标识符的查询。


创建迁移时,您将生成一个名为

Books
(混合大小写)的表,这意味着如果您想访问它,您将需要使用带有确切大小写的带引号的标识符:

select * from "Books"

或者,您需要修改 EF 代码以在迁移中生成大写标识符:

[Table("BOOKS")]
public class Book
{
    [Key]
    [Column("ID")]
    public Guid Id { get; set; }
    [Column("NAME")]
    public string Name { get; set; } = default!;
    [Column("AUTHOR")]
    public string Author { get; set; } = default!;
    [Column("PAGES")]
    public int Pages { get; set; } = default!;
}

然后您将能够在查询中使用不带引号的标识符(在任何情况下)。

另外查看是否有迁移设置会更改所有标识符的大小写。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.