OrmLite - GUID как первичные ключи в Oracle - PullRequest
0 голосов
/ 09 ноября 2018

Я использую OrmLite с диалектами SqlServer, Oracle и PostgreSQL.

Я хочу использовать GUID в качестве первичных ключей и иметь простой объект с использованием атрибута AutoId:

public class MyObject
{
    [AutoId]
    public Guid Id { get; set; }
    [Required]
    public string Name { get; set; }
    ...

Все идет хорошо с диалектами SqlServer и PostgreSQL, но с Oracle я получаю начальный GUID со всеми нулями в БД, а последующая INSERT нарушает ограничение уникального ключа моего первичного ключа.Как это может быть выполнено без учета базы данных, чтобы оно также работало с Oracle?

1 Ответ

0 голосов
/ 17 ноября 2018

Судя по исходному коду, который я смотрю, он не генерирует должным образом GUID для всего, что не является SQL Server или PostgreSQL, независимо от того, что на самом деле написано в документации README . Соответствующие ссылки кода ниже:


Лучшая альтернатива, которую я могу предоставить здесь, - переопределить OracleOrmLiteDialectProvider . В частности, я бы переопределил метод GetAutoIdDefaultValue, чтобы он возвращал "SYS_GUID()", если тип поля - 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 позволяет вам контролировать все в той степени, в которой вы нуждаетесь. Надеюсь это поможет. Кроме того, быстрое предостережение - я не полностью испек это решение, так что вам может нужно его настроить, но на основании других реализаций провайдеров оно кажется простым.

...