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

.net 首先在实体框架代码中将Guid属性映射到Oracle,.net,oracle,entity-framework,ef-code-first,.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) : error 2019: Member Mapping specified is not v

我正在尝试将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'.
我错过了什么

谢谢


RP

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

这里的问题是Oracle数据类型“RAW(16)”与EDM类型“Guid”之间没有直接映射。您可以在开发者指南中找到此信息,网址为:

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

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

我不知道为什么会这样,但它就是这样。希望Oracle能够更新他们的EF库,以便能够使用TypeName=“RAW(16)”之类的东西。希望这能有所帮助。

我做了一个反向工程,以了解Oracle如何处理原始主键,以下是我的发现:

现有数据库设置:

[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()");
});
列名:MSID

类型:生的

长度: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()");
});
生成的上下文:

[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()");
});
modelBuilder.Entity(Entity=>
{
entity.HasKey(e=>e.Msid)
.HasName(“MSM_样本_PK”);
entity.HasIndex(e=>e.Msid)
.HasName(“MSM\U样本\U PK”)
.IsUnique();
Property(e=>e.Msid).HasDefaultValueSql(“sys\u guid()”);
});

我认为在这种情况下,MaxLength属性是不可操作的。如果查看类型定义,您将看到MaxLength是2000,而不是16。顺便说一句,您是否尝试过根本不使用
属性(或者只是不指定类型)。提供程序应该知道如何将GUID类型映射到数据库类型。顺便说一句,您使用的是什么Oracle提供商?谢谢您的回复!我正在使用最新的ODAC。即使没有Column和MaxLength属性,它也不起作用。我设法通过从Guid切换到字节[]来解决这个问题,但我相信这是可以实现的。您可以使用Raw(17)而不是16。这映射到类型二进制。但你得想办法处理这些琐事我也有同样的问题。这太令人沮丧了,似乎没有任何解决办法。。。非常感谢Oracle/Microsoft…我可以先使用ODP.NET使用EF代码吗?ODAC 12c首先不支持EF代码。我对项目太深入,无法更改PK类型。我应该添加另一个ID列类型字符串吗?@Toolkit是什么意思?有复合主键吗?事实上,这个问题太老了,现在我用的是EF-Core,所以我不认为这仍然适用。不,不是复合键。附加数字键。所以我可以做一些事情,比如
db.MyTable.Find(id)因为使用原始Guid是不可能的