我正在尝试将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
答案 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()");
});