OrmLite-GUID作为Oracle中的主键

时间:2018-11-08 22:57:37

标签: ormlite-servicestack

我正在将OrmLite与SqlServer,Oracle和PostgreSQL方言结合使用。

我想使用GUID作为主键,并具有一个使用AutoId属性的简单对象:

function findKey(map, term) {
  var found = [];
  for(var property in map) {
    if(map.hasOwnProperty(property)) {
      for(var key in map[property]) {
        if(map[property].hasOwnProperty(key) && key === term) {
          found.push(property);
        }
      }
    }
  }
  return found;
}

在SqlServer和PostgreSQL Dialetcs上一切都很好,但是在Oracle中,我得到了一个初始GUID,其db中的全零,随后的INSERT违反了我的主键的唯一键约束。 db不可知论的如何做到这一点,以便它也可以与Oracle一起使用?

1 个答案:

答案 0 :(得分:1)

根据我正在查看的源代码,它似乎无法为非SQL Server或PostgreSQL的任何内容正确生成GUID,无论文档在README上实际说了什么。相关代码链接如下:


我在这里可以提供的最佳替代方法是覆盖OracleOrmLiteDialectProvider。具体来说,如果字段类型是GUID,我将覆盖GetAutoIdDefaultValue方法以返回"SYS_GUID()"。下面的示例代码...

public OracleNewGuidOrmLiteDialectProvider : OracleOrmLiteDialectProvider
{
    public static OracleNewGuidOrmLiteDialectProvider Instance = new OracleNewGuidOrmLiteDialectProvider();
    public string AutoIdGuidFunction { get; set; } = "SYS_GUID()";

    public override string GetAutoIdDefaultValue(FieldDefinition fieldDef)
    {
        return fieldDef.FieldType == typeof(Guid)
            ? AutoIdGuidFunction
            : null;
    }   
}

要与其他提供者实现相匹配,我建议创建一个OracleNewGuidDialect类,如下所示……

public static class OracleNewGuidDialect
{
    public static IOrmLiteDialectProvider Provider => OracleNewGuidOrmLiteDialectProvider.Instance;
}

然后,当您将OrmLiteConnectionFactory实例化为OracleNewGuidOrmLiteDialectProvider.Instance时,将设置提供者,类似于下面的内容...

var dbFactory = new OrmLiteConnectionFactory(oracleConnectionString, OracleNewGuidDialect.Provider);

这不是最佳解决方案,但是ServiceStack ORMLite的可插拔特性使您可以根据需要控制一切。希望这可以帮助。另外,快速警告-我没有完全解决此问题,因此您可能需要进行调整,但是基于提供程序的其他实现,这似乎很简单。