在实体框架代码中将Guid属性映射到Oracle

时间:2013-09-15 14:13:16

标签: .net oracle entity-framework ef-code-first

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

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

但是,我一直得到以下例外:

指定的架构无效。错误:

(7,12):错误2019:指定的成员映射无效。类型'Model.Test'中成员'Id'的类型'Edm.Guid [Nullable = False,DefaultValue =]'与'OracleEFProvider.raw不兼容[Nullable = False,DefaultValue =,MaxLength = 2000,FixedLength = False ''成员'Id'在'CodeFirstDatabaseSchema.Test'类型中。

我错过了什么?

谢谢!

RP

3 个答案:

答案 0 :(得分:2)

我放弃了,因为我没有得到甲骨文或微软的回应。据我所知,没有办法让实体框架代码首先在Oracle上使用Guids。 我使用的是String而不是Guid,但我仍然使用Guid.NewGuid()。ToString()填充它,以便我有一个唯一的主键。

答案 1 :(得分:0)

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

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

我们遇到了同样的问题,但只需删除" TypeName"的配置即可解决问题。 [Column]属性上的属性。下面是我们如何修饰代码优先实体属性的示例。

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

我不知道为什么这项工作,但它确实如此。希望Oracle更新他们的EF库,以便能够使用TypeName =" RAW(16)"。希望这会有所帮助。

答案 2 :(得分:0)

我进行了反向工程,以了解Oracle如何处理RAW主键,这就是我所发现的:

现有数据库设置:

列名:MSID

类型:RAW

长度:20

默认值:SYS_GUID()

生成的模型(scaffold-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()");
});