Таблица с одной колонкой

Обсуждение возникших проблем, предложений и ошибок PgDAC компонентов
Ответить
infectioni
Сообщения: 4
Зарегистрирован: Пт 17 янв 2014 08:35

Таблица с одной колонкой

Сообщение infectioni » Пт 17 янв 2014 08:42

Доброго времени суток, вопрос следующий:
У меня есть MVC-приложение C# + Razor, в качестве СУБД - PostgreSQL, и Entity Framework с devart dotConnect for PostgreSQL.

В базе есть табличка, содержащая одну колонку (id), когда я пытаюсь добавить в неё запись:

Код: Выделить всё

var newRecord = new MY_TABLE();
context.MY_TABLE.Add(newRecord);
context.SaveChanges();
вылетает ошибка "Empty insert statement".

Если в таблицу добавить ещё одну фиктивную колонку, то добавление работает. Что это за проблема и можно ли обойтись без этого хака?

Shalex
Devart Team
Сообщения: 19
Зарегистрирован: Пт 12 апр 2013 14:48

Re: Таблица с одной колонкой

Сообщение Shalex » Пт 17 янв 2014 15:40

Мы рекомендуем Вам включить dbMonitor, чтобы определить какой именно SQL запрос отправляется в базу данных:
http://www.devart.com/dotconnect/postgr ... nitor.html
http://www.devart.com/dbmonitor/dbmon3.exe

Вероятно, Вы либо явно задали для свойства опцию DatabaseGeneratedOption.Identity, либо используете EF Code-First (в этом случае EntityKey типа int по умолчанию считается DatabaseGeneratedOption.Identity). Или у Вас Database-First подход, а в таблице колонка типа serial.

infectioni
Сообщения: 4
Зарегистрирован: Пт 17 янв 2014 08:35

Re: Таблица с одной колонкой

Сообщение infectioni » Пн 20 янв 2014 05:45

Использую Code-First, класс выглядит вот так:

Код: Выделить всё

public class MY_TABLE
{
   [Key]
   [ScaffoldColumn(false)]
    public long IdMyTable { get; set; }
}
Просмотрел через dbMonitor, SQL-запроса вообще никакого нет:
Вложения
dbmonitor.jpg
dbmonitor.jpg (124 КБ) 10370 просмотров

Shalex
Devart Team
Сообщения: 19
Зарегистрирован: Пт 12 апр 2013 14:48

Re: Таблица с одной колонкой

Сообщение Shalex » Пн 20 янв 2014 15:10

Ключ Key определяет то, что это primary key колонка. Соглашения EF делают такую колонку Identity (автоинкрементной). Наш провайдер выбирает для такой колонки тип serial. Т.е. в базе создается такая таблица:

Код: Выделить всё

CREATE TABLE my_table
(
  idmytable serial NOT NULL,
  CONSTRAINT mytable_pkey PRIMARY KEY (idmytable)
)
Какой SQL statement должен быть сгенерирован провайдером, чтобы в таблицу была добавлена новая запись на основе сгенерированного значения, и это значение было бы возвращено через RETURNING clause?

infectioni
Сообщения: 4
Зарегистрирован: Пт 17 янв 2014 08:35

Re: Таблица с одной колонкой

Сообщение infectioni » Вт 21 янв 2014 05:19

У меня CodeFirst, но при существующей БД, скрипт таблицы выглядит так:

Код: Выделить всё

CREATE TABLE dbo."MY_TABLE"
(
  "IdMyTable" bigint NOT NULL DEFAULT nextval('dbo."MY_TABLE_IdMyTable_seq"'::regclass),
  CONSTRAINT "PK_MY_TABLE" PRIMARY KEY ("IdMyTable")
)
Немного погуглив, нашел, что в таких случаях скрипт вставки выглядит следующим образом:

Код: Выделить всё

INSERT INTO dbo."MY_TABLE" default
VALUES;

Shalex
Devart Team
Сообщения: 19
Зарегистрирован: Пт 12 апр 2013 14:48

Re: Таблица с одной колонкой

Сообщение Shalex » Вт 21 янв 2014 16:41

Спасибо за предоставленную информацию. Мы сообщим Вам, когда генерация такого SQL будет добавлена в нашу реализацию EF провайдера.

Shalex
Devart Team
Сообщения: 19
Зарегистрирован: Пт 12 апр 2013 14:48

Re: Таблица с одной колонкой

Сообщение Shalex » Пн 27 янв 2014 11:21

Генерация SQL для класса с одним свойством, которое является Identity, добавлена в реализацию EF провайдера dotConnect for PostgreSQL. Мы сообщим Вам, когда соответствующий билд будет доступен для загрузки.

Shalex
Devart Team
Сообщения: 19
Зарегистрирован: Пт 12 апр 2013 14:48

Re: Таблица с одной колонкой

Сообщение Shalex » Чт 30 янв 2014 16:59

Новый билд dotConnect for PostgreSQL 7.2.90 доступен для загрузки: http://forums.devart.com/viewtopic.php?f=3&t=28828.

infectioni
Сообщения: 4
Зарегистрирован: Пт 17 янв 2014 08:35

Re: Таблица с одной колонкой

Сообщение infectioni » Пт 31 янв 2014 06:33

Уже качаю, зашел на форум сказать спасибо, спасибо!

Ответить