【问题标题】:Map Guid Property to Oracle in Entity Framework Code First首先在实体框架代码中将 Guid 属性映射到 Oracle
【发布时间】:2013-09-15 14:13:16
【问题描述】:

我正在尝试将 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

【问题讨论】:

  • 我相信 MaxLength 属性在这种情况下是无操作的。如果您查看类型定义,您将看到 MaxLength 是 2000 而不是 16。顺便说一句。您是否尝试过根本不使用 Column 属性(或者只是不指定类型)。提供者应该知道如何将 GUID 类型映射到数据库类型。顺便提一句。您使用哪个 Oracle 提供商?
  • 感谢您的回复!我正在使用最新的 ODAC。即使没有 Column 和 MaxLength 属性,它也不起作用。我设法通过从 Guid 切换到 Byte[] 来解决它,但我相信这是可以实现的。
  • 您也许可以使用 Raw(17) 而不是 16。这映射到二进制类型。但是你必须弄清楚如何处理字节

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


【解决方案1】:

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

【讨论】:

  • 我遇到了同样的问题。这太令人沮丧了,似乎没有任何解决方案……谢谢甲骨文/微软……
  • 我可以在 ODP.NET 中使用 EF Code First 吗? ODAC 12c 不支持 EF Code First。
  • 我对项目太深入了,无法更改 PK 类型。我应该添加另一个 ID 列类型字符串吗?
  • 你是什么意思,@Toolkit?有一个复合主键?其实这个问题太老了,现在我用的是EF Core,所以我觉得还是不适用。
  • No 不是复合键。附加数字键。所以我可以做 db.MyTable.Find(id); 这样的事情,因为使用 Raw-Guid 是不可能的
【解决方案2】:

这里的问题是“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)" 之类的东西。希望这会有所帮助。

【讨论】:

    【解决方案3】:

    我做了一个逆向工程,看看 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()");
    });
    

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2011-08-06
      • 2012-01-09
      • 2011-08-08
      相关资源
      最近更新 更多