【问题标题】:Postgresql: autogeneration of 'uuid' doesn't work with EntityFrameworkPostgresql:“uuid”的自动生成不适用于实体框架
【发布时间】: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


【解决方案1】:

您没有编写您使用的 EF 提供程序。我猜它是 npgsql。

根据最新消息来源,它应该返回发布的 Sql Erwin Brandstetter:

INSERT INTO public."MyClass"("Name") VALUES ("Test") RETURNING "Id";

以下是 sql 生成器的相关部分: SqlInsertGenerator classAppendReturning method

我会尝试最新版本的 npgsql(甚至可以自己从源代码构建它)。

【讨论】:

    【解决方案2】:

    使用RETURNING 子句进行简化:

    INSERT INTO public."MyClass"("Name") VALUES ("Test") RETURNING "Id";
    

    没有单独的SELECT,因此不会混淆与SELECT 中的函数匹配的列的默认值。更简单、更快、更清洁。

    更多详情:
    PostgreSQL next value of the sequences?

    【讨论】:

      【解决方案3】:

      我假设您使用的是https://github.com/npgsql/Npgsql

      我想知道您使用的是什么版本,因为您可能正在从源代码构建自己的 dll,因为 https://github.com/npgsql/Npgsql/pull/91 还不是任何版本的一部分...如果您选择 PR91,您可能也应该选择樱桃这个 PR160 https://github.com/npgsql/Npgsql/pull/160 正好解决了你的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-13
        • 1970-01-01
        • 2015-11-12
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 2016-10-01
        相关资源
        最近更新 更多