请帮忙,我正在将 EF Core 与 Oracle 一起使用(代码优先),并在
dotnet ef database update
之后收到此错误,并且我不知道无效的数据类型是什么:
2024-09-27 16:11:34,098 INFO Microsoft.EntityFrameworkCore.Database.Command - Executed DbCommand (73ms) [Parameters=[], CommandType='Text', CommandTimeout='0']
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE
"RunnerStates" (
"Id" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY NOT NULL,
"Name" NVARCHAR2(450) NOT NULL,
"Description" NVARCHAR2(2000),
CONSTRAINT "PK_RunnerStates" PRIMARY KEY ("Id")
)';
END;
2024-09-27 16:11:34,121 ERROR Microsoft.EntityFrameworkCore.Database.Command - 2024-09-27 16:11:34.121034 ThreadID:1 (ERROR) OracleRelationalCommand.ExecuteNonQuery() : Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-00902: invalid datatype
ORA-06512: at line 2
https://docs.oracle.com/error-help/db/ora-00902/
at OracleInternal.ServiceObjects.OracleFailoverMgrImpl.OnError(OracleConnection connection, CallHistoryRecord chr, Object mi, Exception ex, Boolean bTopLevelCall, Boolean& bCanRecordNewCall)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
at Oracle.EntityFrameworkCore.Storage.Internal.OracleRelationalCommandBuilderFactory.OracleRelationalCommandBuilder.OracleRelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
2024-09-27 16:11:34.121034 ThreadID:1 (ERROR) OracleRelationalCommand.ExecuteNonQuery() : Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-00902: invalid datatype
ORA-06512: at line 2
https://docs.oracle.com/error-help/db/ora-00902/
at OracleInternal.ServiceObjects.OracleFailoverMgrImpl.OnError(OracleConnection connection, CallHistoryRecord chr, Object mi, Exception ex, Boolean bTopLevelCall, Boolean& bCanRecordNewCall)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
at Oracle.EntityFrameworkCore.Storage.Internal.OracleRelationalCommandBuilderFactory.OracleRelationalCommandBuilder.OracleRelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
这是C#中的实体:
public class RunnerState
{
public int Id { get; set; }
public required string Name { get; set; }
public string? Description { get; set; }
}
这是实体配置:
public class RunnerStateConfiguration : IEntityTypeConfiguration<RunnerState>
{
public void Configure(EntityTypeBuilder<RunnerState> builder)
{
builder
.HasKey(s => s.Id);
builder
.HasIndex(s => s.Name)
.IsUnique(true);
builder
.HasData(
new RunnerState
{
Id = 1,
Name = "AVAILABLE",
Description = "The runner is available for receiving and executing assigned tasks.",
},
new RunnerState
{
Id = 2,
Name = "UNAVAILABLE",
Description = "The runner is unavailable for receiving and executing assigned tasks.",
});
}
}
我需要添加更多细节,但我真的不知道还要添加什么。 oracle 用户/模式为空,这是创建初始迁移后第一次尝试更新数据库。
谢谢!
“描述”NVARCHAR2(2000),
将是我首先看的地方。默认情况下,NVARCH2 列的最大字节大小为 4000 字节。 因此,如果您使用 UTF-16 字符集,则每个字符 4 个字节,对于“描述”列而言,即 8000 个字节。 因此,您要么想要显式更改数据库本身中 NVARCHAR2 列的最大大小,将字符集更改为较小的字符集,要么将“描述”列大小限制为连贯定义中的 500 个字符,或者使用 [StringLength(50) ] 属性和/或在表创建 sql 中。