4

我正在尝试将 Guid 属性映射到 Oracle。这是它的声明:

[Key]
[Column(Order = 0, TypeName = "RAW")]
[MaxLength(16)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid Id { get; set; }

但是,我不断收到以下异常:

指定的架构无效。错误:

(7,12) : error 2019: Member Mapping specified is not valid. The type 'Edm.Guid[Nullable=False,DefaultValue=]' of member 'Id' in type 'Model.Test' is not compatible with 'OracleEFProvider.raw[Nullable=False,DefaultValue=,MaxLength=2000,FixedLength=False]' of member 'Id' in type 'CodeFirstDatabaseSchema.Test'.

我错过了什么?

谢谢!

反相

4

3 回答 3

4

我已经放弃了,因为我没有得到甲骨文或微软的回应。据我所知,没有办法让 Entity Framework Code First 在 Oracle 上使用 Guid。我使用的是字符串而不是 Guid,但我仍然使用 Guid.NewGuid().ToString() 填充它,这样我就有了唯一的主键。

于 2013-09-17T02:55:34.853 回答
1

这里的问题是“RAW(16)”的 Oracle 数据类型没有直接映射到“Guid”的 EDM 类型。您可以在以下开发人员指南中找到此信息:

https://docs.oracle.com/database/121/ODPNT/entityEDMmapping.htm#ODPNT8275

我们遇到了同样的问题,但能够通过简单地删除 [Column] 属性上的“TypeName”属性的配置来解决它。下面是我们如何装饰我们的代码优先实体属性的示例。

[Column("ColumnName")]
public Guid Uid{ get; set; }

我不知道为什么会这样,但确实如此。希望 Oracle 更新他们的 EF 库,以便能够使用 TypeName = "RAW(16)" 之类的东西。希望这可以帮助。

于 2016-09-09T05:24:42.650 回答
0

我做了一个逆向工程,看看 Oracle 如何处理 RAW 主键,这就是我发现的:

现有数据库设置:

列名:MSID

类型:RAW

长度:20

默认值:SYS_GUID()

生成的模型(脚手架-dbcontext):

[Column("MSID")]
[MaxLength(20)]
public byte[] Msid { get; set; }

生成的上下文:

modelBuilder.Entity<MsmSample>(entity =>
{
  entity.HasKey(e => e.Msid)
        .HasName("MSM_SAMPLE_PK");

  entity.HasIndex(e => e.Msid)
        .HasName("MSM_SAMPLE_PK")
        .IsUnique();

  entity.Property(e => e.Msid).HasDefaultValueSql("sys_guid()");
});
于 2020-05-12T14:06:27.703 回答