【发布时间】:2022-01-15 06:10:48
【问题描述】:
我正在使用 .net6 和 efcore6。
我有一个名为 Notification 的数据库实体,它的主键类型为 NotificationId。我正在使用类型转换器和值转换器来使 EFCore 能够在复杂类型和基本 CLR 类型之间进行转换。我的复杂类型基于整数。
当我尝试将新记录保存到此数据库时,我收到一个异常,似乎表明我没有配置值生成器。
完整的例外是: “Notification.Id”属性没有设置值,并且“NotificationId”类型的属性没有可用的值生成器。在添加实体之前为属性设置一个值,或者在“OnModelCreating”中为“NotificationId”类型的属性配置一个值生成器
在我的实体类型配置中,我有:
builder.Property(x => x.Id)
.ValueGeneratedOnAdd()
.HasConversion(
x => x.Value,
x => IntIdValue.From<TKey>(x))
;
builder.HasKey(x => x.Id);
这正确地将 Id 类型设置为 Identity,以及迁移中显示的主键:
migrationBuilder.CreateTable(
name: "Notification",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
...
constraints: table =>
{
table.PrimaryKey("PK_Notification", x => x.Id);
如何说服 EF 使用身份值生成器?
【问题讨论】:
-
值转换器不会为空值运行。这可能是问题吗? docs.microsoft.com/en-us/ef/core/modeling/…
-
@DavidBrowne-Microsoft 这是一个有趣的想法,但我明白这就是 EF 知道如何处理数据库生成的值的方式。我尝试将“值”设置为 0,但由于多个记录具有相同的“idl”,这会混淆更改检测代码。
标签: c# entity-framework entity-framework-core