Вставка с использованием шаблонов linq, не возвращающих идентификатор - MySQL - PullRequest
0 голосов
/ 26 ноября 2009

Я использую последнюю дозвуковую dll и последние шаблоны linq от github. БД, в которую я вставляю, - это MySQL. Столбец Id в таблице является автоматическим приращением первичного ключа.

Версии: Subsonic.Core.dll - 3.0.0.3 - (18 ноября 2009 г. Объединенные извлечения из Github).

LinqTemplates - 29 июля 2009 г.

MySQL.Data.CF.dll - 6.1.2.0.

Строка вставлена, но идентификатор возвращается как 0.

Пример вставки:

mysqldb db = new mysqldb.mysqldbDB();
int ID = db.Insert.Into<db.myTable>(
    r => r.message,
    r => r.name,
    r => r.status).Values(
    message,
    name,
    status).Execute();

Я что-то не так делаю? Не должен ли быть возвращен новый идентификатор, а не ноль?

1 Ответ

1 голос
/ 27 ноября 2009

Найдена ошибка в дозвуковом ядре.

Это в Subsonic.Core.Query.Insert.cs

Метод Execute не имеет условия для возвращаемых идентификаторов типа long.

Я переписал метод в своей локальной версии:

    public int Execute()
    {
        int returner = 0;

        object result = _provider.ExecuteScalar(GetCommand());
        if(result != null)
        {
            if(result.GetType() == typeof(decimal))
                returner = Convert.ToInt32(result);
            else if (result.GetType() == typeof(int))
                returner = Convert.ToInt32(result);
            else if (result.GetType() == typeof(long))
                returner = Convert.ToInt32(result);
            else
                returner = Convert.ToInt32(result);
        }
        return returner;
    }

Я изменил несколько операторов if на else if и добавил сравнение типов long. Также я добавил последнее условие else, которое выполняет преобразование в int. Не уверен, что это хорошая идея, но она работает для меня.

Если кто-то хочет обновить источник, отлично. Если я найду время в ближайшее время, я обновлю его сам.

...