2014-05-19 82 views
0

我使用實體框架(POCO方法)在.NET中使用'PostgreSql'。Postgresql:'uuid'的自動生成不適用於EntityFramework

我的目標是在數據庫端生成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... 

我檢查SQL查詢,其中EF發送到PostgreSQL:

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'類型的自動生成列?

+0

這是完全預期的。問題存在於PostgreSQL中,它似乎默認情況下不會生成新的UUID。然而,要求數據庫生成一個新的UUID,每個插入都會使用UUID作爲主鍵。 UUID的重點在於它們可以由客戶端生成。 – Aron

+0

我假設你首先使用數據庫,而不是Code First EF。 – Aron

+0

我正在使用Code-First方法。 在某些情況下,我已經存在數據庫,我必須根據數據庫結構調整我的模型(它就像DB-First方法,但我不使用設計器)。有些表包含自動生成的'uuid'主鍵,因此使用此功能看起來合乎邏輯。 解決方法是否有解決方法或一些討論可以修復? – user3653175

回答

0

簡化與RETURNING條款:

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

沒有單獨SELECT,所以沒有關於你的SELECT匹配函數列的默認值混淆。更簡單,更快,更清潔。

更多細節:
PostgreSQL next value of the sequences?

1

你沒有什麼EF提供商您使用的書寫。我認爲這是npgsql。

據最新消息透露它應該返回的Sql歐文Brandstetter修改發佈:

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

這裏是SQL生成的相關部分: SqlInsertGenerator classAppendReturning method

我想嘗試最新版本的Npgsql的的(甚至可以從源代碼自己構建它)。

相關問題