Как получить следующий порядковый номер в DB2, используя Entity Framework? - PullRequest
1 голос
/ 16 апреля 2009

Я хочу получить следующий порядковый номер с помощью специального запроса в Entity Framework. Я использую:

LogEntities db = new LogEntities();

ObjectQuery<Int64> seq = db.CreateQuery<Int64>("SELECT AUDITLOG.EVENTID_SEQ.NEXTVAL from sysibm.sysdummy1");

Возвращает следующую ошибку:

ErrorDescription = "'sysibm.sysdummy1' не может быть разрешен в текущей области или контексте. Убедитесь, что все переменные, на которые имеются ссылки, находятся в области, что необходимые схемы загружены и что на пространства имен ссылаются правильно." 1007 *

Полагаю, это потому, что sysdummy1 не является сопоставленной таблицей в моей модели.

Кто-нибудь знает, как я могу выполнить этот запрос, используя контекст сущности LINQ 2?

Ответы [ 3 ]

1 голос
/ 17 апреля 2009

Спасибо за ваш ответ, Крейг. Причина, по которой я не могу использовать столбец идентификаторов с автоинкрементом, заключается в том, что эта конкретная логическая таблица физически разделена на 31 отдельную (ежедневную) таблицу, и идентификатор должен быть уникальным для всех таблиц.

Я закончил тем, что создал хранимую процедуру для извлечения следующего числа из последовательности, а затем добавил ее в мой магазин EF Model.

private static long GetNextEventId(DbConnection dbConnection)
{
    using (DbCommand cmd = dbConnection.CreateCommand())
    {
        cmd.CommandText = "LogEntities.GetNextEventId";
        cmd.CommandType = CommandType.StoredProcedure;

        // Execute the command
        return Convert.ToInt64(cmd.ExecuteScalar());
    }
}

Вот еще один способ вызова хранимого процесса в EF, который возвращает скаляр.

Использование хранимых процедур, которые возвращают не тип сущности

1 голос
/ 16 апреля 2009

ObjectQuery должен использовать Entity SQL, а не «обычный» SQL. Если вы хотите написать «обычный» SQL, вам нужно использовать подключение к магазину, а не ObjectQuery. Тем не менее, я немного удивляюсь, почему вы вручную получаете порядковый номер. Если для свойства объекта установлено автоматическое увеличение на сервере, оно будет получено автоматически при сохранении изменений. Если вам нужно получить подключение к магазину, есть метод типа EntityConnection, CreateDbCommand , который делает это. Опять же, я рекомендую вам не делать этого. Использование этой функции делает ваш код специфичным для провайдера. Большая часть кода Entity Framework должна быть независимой от поставщика.

0 голосов
/ 20 апреля 2009

Другой вариант - создать таблицу со столбцом идентификаторов и использовать функцию из функции val значения после вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...