23502: нулевое значение в столбце «id» нарушает ограничение ненулевого значения в postgreSQL

Я создаю таблицу с первичным ключом.

Я попытался вставить новые данные с помощью entityframework6, но получил ошибку 23502.

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

Я не понимаю, почему он может получить эту ошибку.

Таблица DDL:

CREATE TABLE ERRORLOG(
id numeric NOT NULL,
message varchar(50) NULL,
CONSTRAINT pterrorlog_pk PRIMARY KEY (id)
);

Модель:

public partial class ERRORLOG
{
    [Key]
    [Column(Order = 0)]
    public long ID { get; set; } = DateTimeOffset.Now.ToUnixTimeMilliseconds();
    public string MESSAGE { get; set; }
}

Функция:

using (DbContext Db as new DbContext)
using (TransactionScope transactionScope = new TransactionScope())
{
    ERRORLOG iLog = new ERRORLOG();
    iLog.MESSAGE = Message;
    Db.ERRORLOG.Add(iLog);
    Db.SaveChanges(); //Get 23502 error
}

Вот скрипт вставки, похоже не вставил id, почему так?

INSERT INTO "pterrorlog"("message") VALUES (@p_0) RETURNING "id"

Редактировать:

После того, как я добавил этот скрипт в модель, теперь он работает нормально.

public partial class ERRORLOG
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.None)]
  public long ID { get; set; } = DateTimeOffset.Now.ToUnixTimeMilliseconds();
  public string MESSAGE { get; set; }
}

Сообщение об ошибке понятно. Вы пытаетесь вставить NULL в ненулевой столбец id. Также покажите оператор вставки.

Arun Palanisamy 26.12.2020 11:26

@ArunPalanisamy Я обновляю оператор, похоже, он не вставил столбец id, почему?

EvaHHHH 27.12.2020 06:44

Я мог видеть, что вы не передаете никаких значений id. Это столбец с автоинкрементом?

Arun Palanisamy 27.12.2020 13:55

@ArunPalanisamy Я использую этот скрипт, чтобы установить его значение: public long ID { get; набор; } = DateTimeOffset.Now.ToUnixTimeMilliseconds();

EvaHHHH 28.12.2020 01:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
4 296
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать PGAdmin для профилирования SQL, который EF фактически пытается выполнить на SaveChanges. C# чувствителен к регистру, в то время как Postgres по умолчанию использует нижний регистр. Насколько я помню, NPGSQL будет форматировать все запросы EF SQL с двойными кавычками, поэтому, если ваши объекты были объявлены со свойствами, такими как ID, он будет генерировать такие операторы, как INSERT INTO "ERRORLOG" ( "ID", "MESSAGE" ) VALUES ( ... ), поэтому столбец с именем «id» не будет установлен.

Если вы хотите, чтобы ваши объекты использовали регистр, отличный от БД, и оставили Postgres в нижнем регистре, я бы рекомендовал использовать атрибуты [Column] для переименования столбцов:

public partial class ERRORLOG
{
    [Key, Column(Name = "id")]
    public long ID { get; set; } = DateTimeOffset.Now.ToUnixTimeMilliseconds();
    [Column(Name = "message")]
    public string MESSAGE { get; set; }
}

Другая деталь заключается в том, что Order в атрибуте Column требуется только при работе с составными ключами, такими как таблицы соединения «многие ко многим», где ПК состоит из двух или более столбцов. Это не требуется для обычных ПК с одним значением.

Если причина не в этом, проверка оператора вставки в PGAdmin должна дать вам представление о том, что пытается выполнить NPGSQL/EF.

Ответ принят как подходящий

Похоже, что Entity Framework автоматически вставляет значение в столбец. После того, как я добавил скрипт для предотвращения этой проблемы, теперь он работает нормально.

[DatabaseGenerated(DatabaseGeneratedOption.None)]

Модель хотела бы:

public partial class ERRORLOG
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.None)]
  public long ID { get; set; } = DateTimeOffset.Now.ToUnixTimeMilliseconds();
  public string MESSAGE { get; set; }
}

Другие вопросы по теме