2010-05-13 105 views
9

我有一個SQL Server 2008數據庫表,它使用uniqueidentifier作爲主鍵。在插入時,使用newid()函數在數據庫端生成密鑰。實體框架 - GUID爲EntityKey的SaveChanges

這適用於ADO.NET。但是當我在Entity Framework 4模型中將此表設置爲實體時,存在一個問題。我能夠很好地查詢實體,但是當創建一個新實體並在上下文中調用SaveChanges()時,數據庫上生成的uniqueidentifier全爲零。

據我所知,在這種情況下無法正常工作的EF v1存在問題,因此需要在調用SaveChanges之前在客戶端上創建GUID。不過,我曾在很多地方看過他們打算在EF 4中修復這個問題。

我的問題 - 這種情況(DB端代uniqueidentifier)在EF4中是不支持的嗎?我們仍然堅持在客戶端上生成GUID嗎?

+0

只是出於好奇,爲什麼你覺得你是「卡」在客戶端上生成的GUID?這是uniqueidentifier,IMO的主要優勢*。如果您想在服務器上生成ID,爲什麼不使用自動遞增鍵? – MusiGenesis 2010-05-13 13:48:13

+0

順便說一下,很棒的暱稱。 :) – MusiGenesis 2010-05-13 13:48:41

+0

@MusiGenesis,1. MissingLinq確實需要一個自動生成的鍵,只是不是一個int(也許因爲他們有更多的限制範圍)。 2.數據庫生成密鑰的目的是消除衝突,使用GUID的機會可能是1/2^128,但爲什麼不讓數據庫這樣做,讓客戶端代碼只是擔心創建實體而不是數據庫密鑰。 – 2011-04-06 15:14:47

回答

4

是的,這改變了EF 4 You can now use a server generated GUID。 @MusiGenesis,服務器生成的GUID有一些優勢;它們可以是順序的,例如,

+0

克雷格 - 我見過這個鏈接。它說「提供者必須能夠在插入行後返回服務器生成的標識值,SQL Server可以通過從SQL Server 2005開始的OUTPUT子句返回服務器生成的GUID類型。」 這似乎表明,我需要一個存儲過程。我實際上想知道這是否本機支持,如果是這樣,爲什麼我會得到一個「空」(全零)標識符? – MissingLinq 2010-05-13 20:39:25

+0

不,[OUTPUT使用插入](http://msdn.microsoft.com/en-us/library/ms174335.aspx)。看看生成的插入,並確保它包括OUTPUT> – 2010-05-14 15:28:57