【发布时间】:2014-05-19 15:22:41
【问题描述】:
我使用实体框架(POCO 方法)在 .NET 中使用“PostgreSql”。
我的目标是在数据库端在数据库生成 Id (uuid) 中创建一条新记录,并将生成的 Id 检索到服务器(这种情况与 SQL Server 完美配合)。
我的模型看起来像:
public class MyClass
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string Name { get; set; }
}
在 PostgreSql 列 'Id' 中具有默认值 'uuid_generate_v4()'
当我尝试使用 EF 向数据库添加新对象时,出现以下错误:
A null store-generated value was returned for a non-nullable member 'Id' of type...
我检查 EF 发送到 PostgreSQL 的 SQL 查询:
INSERT INTO "public"."MyClass"("Name") VALUES ("Test");
SELECT currval(pg_get_serial_sequence('"public"."MyClass"', 'Id')) AS "Id"
第一个看起来不错。如果我执行它,则在 DB 中创建新行(使用新生成的 id) 第二个返回 NULL,列的名称是“Id bigint”。 看来,此功能仅适用于数字 id。
是否可以使其适用于“uuid”类型的自动生成列?
【问题讨论】:
-
这完全在意料之中。 PostgreSQL 中存在问题,默认情况下似乎没有生成新的 UUID。但是,每次插入都要求数据库生成一个新的 UUID,这违背了使用 UUID 作为主键的意义。 UUID 的全部意义在于它们可以由客户端生成。
-
我当然假设您首先使用数据库而不是 Code First EF。
-
我正在使用代码优先的方法。在某些情况下,我已经存在数据库,我必须根据数据库结构调整我的模型(它类似于 DB-First 方法,但我不使用设计器)。一些表包含自动生成的 'uuid' 主键,因此使用此功能看起来合乎逻辑。是否有解决方法或一些可以修复的讨论?
-
这个问题不再是关于实体框架,而是关于 Postgres。我对此一无所知。发布一个关于将其添加到表中的新问题。
标签: sql entity-framework postgresql identity sql-insert