c# - 从 EF Core 和 npgsql 中的现有序列中获取新记录的 ID
问题描述
我在项目中搭建了一个现有数据库,并尽我所知调整了实体属性。
现在,当我尝试保存新记录时,我收到 ID 列不允许为空的错误,因为它是主键。
我使用 PostgreSQL 数据库,我的模型构建器如下所示:
modelBuilder.ForNpgsqlUseIdentityColumns();
modelBuilder.HasSequence<int>("contact_id_seq");
modelBuilder.Entity<Contact>(entity =>
{
entity.HasKey(e => e.Id);
entity.ToTable("contact");
entity.Property(e => e.Id)
.HasColumnName("id")
.HasDefaultValueSql("nextval('contact_id_seq')")
.ValueGeneratedOnAdd();
[...]
}
该模型:
public partial class Contact {
[DisplayName("DBID")]
public int Id { get; set; }
[...]
}
控制器调用:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("<model member>")] Contact contact) {
(ModelState.IsValid) {
_context.Add(contact);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(contact);
}
postgreSQL 数据库中的序列如下所示:
-- Sequence: contact_id_seq
-- DROP SEQUENCE contact_id_seq;
CREATE SEQUENCE contact_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 12758
CACHE 1;
ALTER TABLE contact_id_seq
OWNER TO postgres;
错误:
Npgsql.PostgresException (0x80004005): 23502: null value in column "id" violates not-null constraint
at Npgsql.NpgsqlConnector.<>c__DisplayClass161_0.<<ReadMessage>g__ReadMessageLong|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
更新:
我也尝试过select nextval('contact_id_seq')
额外的模型注释,例如[Key]
或[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
无济于事。我的解决方案用完了,也许我应该用 sqlcommand 查询 nextval ......
Update2: 作为一种解决方法,我现在正在对序列值进行原始 sql 查询:
using (DbCommand cmd = _context.Database.GetDbConnection().CreateCommand())
{
cmd.CommandText = "select nextval('contact_id_seq')";
_context.Database.OpenConnection();
DbDataReader reader = cmd.ExecuteReader();
reader.Read();
newID = (int)reader.GetValue(0);
_context.Database.CloseConnection();
}
我使用了这里的信息:https ://www.npgsql.org/efcore/value-generation.html
我尝试使用适当的关键字搜索问题,但除了链接的关键字之外,我找不到使用我的星座的关键字。
Microsoft.EntityFrameworkCore.Tools 2.1.0
Npgsql.EntityFrameworkCore.PostgreSQL 2.1.0
PostgreSQL 9.6.10
解决方案
推荐阅读
- javascript - 我如何使用 aurelia 触发器向 mongodb 发帖?
- php - 显示文件夹中的图像
- java - 根据两个 Optional 的值调用不同的方法
- c++ - 将可变参数模板参数转换为静态 constexpr 数组
- python - 正则表达式搜索中间有日期的文件
- highcharts - Highchart sankey-独立显示多个具有相同名称的条目
- excel - Outlook VBA 代码更新工作表后 Excel 文档锁定为只读
- mysql - 插入新行时自动更新 MySQL 行
- php - 正则表达式从字符串中删除特定的样式标签
- java-8 - 如何在 Project Reactor 中缓存项目并避免缓存踩踏?