ORA-00902:EF Core 的数据类型无效

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

请帮忙,我正在将 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 用户/模式为空,这是创建初始迁移后第一次尝试更新数据库。

谢谢!

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

“描述”NVARCHAR2(2000),

将是我首先看的地方。默认情况下,NVARCH2 列的最大字节大小为 4000 字节。 因此,如果您使用 UTF-16 字符集,则每个字符 4 个字节,对于“描述”列而言,即 8000 个字节。 因此,您要么想要显式更改数据库本身中 NVARCHAR2 列的最大大小,将字符集更改为较小的字符集,要么将“描述”列大小限制为连贯定义中的 500 个字符,或者使用 [StringLength(50) ] 属性和/或在表创建 sql 中。

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