2010-05-13 21 views
9

Tengo una tabla de base de datos de SQL Server 2008 que usa uniqueidentifier como clave principal. En las inserciones, la clave se genera en el lado de la base de datos utilizando la función newid().Entity Framework - SaveChanges con GUID como EntityKey

Esto funciona bien con ADO.NET. Pero cuando configuro esta tabla como una entidad en un modelo de Entity Framework 4, hay un problema. Puedo consultar la entidad muy bien, pero al crear una nueva entidad e invocar SaveChanges() en el contexto, el identificador único generado en la base de datos es todo ceros.

Entiendo que había un problema con EF v1 donde este escenario no funcionaba, lo que requería crear el GUID en el cliente antes de llamar a SaveChanges. Sin embargo, había leído en muchos lugares que planeaban solucionar esto en EF 4.

Mi pregunta: ¿este escenario (generación del lado DB del identificador único) aún no es compatible con EF4? ¿Todavía estamos atrapados con la generación del GUID en el cliente?

+0

Sólo por curiosidad, ¿Por qué siente que está "pegado" con la generación de la GUID en el cliente? Esta es la principal * ventaja * de uniqueidentifier, IMO. Si desea generar identificaciones en el servidor, ¿por qué no simplemente usar una clave de incremento automático? – MusiGenesis

+0

Gran apodo, por cierto. :) – MusiGenesis

+0

@MusiGenesis, 1. MissingLinq quiere una clave generada automáticamente, simplemente no es una int (quizás porque tienen rangos más limitados). 2. El objetivo de las claves generadas por la base de datos es eliminar colisiones, con un GUID la posibilidad de que sea 1/2^128, pero ¿por qué no dejar que la base de datos haga eso y dejar que el código del cliente simplemente se preocupe por crear las entidades y no claves de la base de datos –

Respuesta

4

Sí, esto cambió en EF 4. You can now use a server generated GUID. @MusiGenesis, los GUID generados por el servidor tienen algunas ventajas; pueden ser secuenciales, p.

+0

Craig - He visto ese enlace. Dice que "el proveedor debe poder devolver el valor de identidad generado por el servidor después de insertar una fila. SQL Server puede devolver el tipo de GUID generado por el servidor a través de la cláusula OUTPUT que comienza con SQL Server 2005". Esto parece indicarme que se requeriría un procedimiento almacenado. En realidad, quería saber si esto es compatible de forma nativa, y si es así, ¿por qué obtengo un identificador "nulo" (todos los ceros)? – MissingLinq

+0

No, [OUTPUT funciona con INSERT] (http://msdn.microsoft.com/en-us/library/ms174335.aspx). Mire el INSERT generado y asegúrese de que incluya OUTPUT> –

Cuestiones relacionadas