背景
我有一个这样的表格模型:
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\
表已按指定创建:
哪里出了问题
我期望看到的是我可以像这样查询我的表:
select * from Books b
但是它指出“表或视图不存在”。
如果我生成查询,它会像这样执行:
select * from "Books" b
这工作正常,但与所有其他表的设置方式不同。
我的问题
如何在不需要那些额外的双精度的情况下生成我的表 报价?
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!;
}
然后您将能够在查询中使用不带引号的标识符(在任何情况下)。
另外查看是否有迁移设置会更改所有标识符的大小写。