2010-05-13 120 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