Я создаю таблицу с первичным ключом.
Я попытался вставить новые данные с помощью 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; }
}
@ArunPalanisamy Я обновляю оператор, похоже, он не вставил столбец id, почему?
Я мог видеть, что вы не передаете никаких значений id
. Это столбец с автоинкрементом?
@ArunPalanisamy Я использую этот скрипт, чтобы установить его значение: public long ID { get; набор; } = DateTimeOffset.Now.ToUnixTimeMilliseconds();
Вы можете использовать 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; }
}
Сообщение об ошибке понятно. Вы пытаетесь вставить
NULL
в ненулевой столбецid
. Также покажите оператор вставки.