我正在将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一起使用?
答案 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的可插拔特性使您可以根据需要控制一切。希望这可以帮助。另外,快速警告-我没有完全解决此问题,因此您可能需要进行调整,但是基于提供程序的其他实现,这似乎很简单。