2010-08-19 10 views
5

Para mi clave principal e identidad en nuestra tabla Clientes, utilizo la columna uniqueidentifier con un valor predeterminado establecido en newsequentialid(). Al insertar nuevas filas a través de la herramienta de administración, se crean los valores para la multa de ID.Uso del tipo de columna SQL de identificador único con el marco Entidad

Insertar desde el código .NET 4 a través de los resultados de EF en cero GUID (00000-0000 ....) insertados. Creo la entidad con nuevo, establezco algunos valores y realizo EF AddToClients (por ejemplo). Si se depura, el valor de la propiedad de id. Muestra cero GUID. No establezco explícitamente la identificación a través de Guid.NewGuid() en mi código porque quiero dejarlo en el newsequentialid() en SQL Server. El problema es que no funciona. La primera vez que se ejecuta el código, la fila se inserta con cero GUID. La próxima vez, obviamente, falla y genera una excepción de violación de clave principal.

¿Cómo puedo hacer que esto funcione sin tener que configurar el GUID en mi código de cliente?

Respuesta

10

Debe cambiar el valor StoreGeneratedPattern para la propiedad en el diseñador de EF. Establézcalo en Identity. Esto hará que EF evite establecer el valor en un inserto, luego lo capturará después de completar el inserto.

Tenga en cuenta que si utiliza EF 4, puede tener problemas con el uso exclusivo del diseñador (consulte this link). Puede que tenga que editar el .edmx manualmente y configurar el StoreGeneratedPattern en el modelo de almacenamiento.

+0

lo hizo. Ningún cambio. La entidad todavía tiene configurado ZERO GUID antes de la inserción y la inserción falla con la clave duplicada (dejé la que estaba previamente insertada en la tabla). – mare

+0

ohh veo sobre los problemas del diseñador ... esto es simplemente genial. En la parte superior de otro problema que escribí sobre en otra pregunta, ahora esto. Gracias por la respuesta sin embargo. – mare

+0

@mare: Siento tu dolor.EF es una herramienta poderosa, pero cuando encuentras algo que no maneja * bien *, puede ser un gran dolor de cabeza para evitarlo. –

0

Me encontré con este mismo problema. Es un verdadero dolor Aquí hay una página al respecto, con comentarios de Microsoft - http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/aecf14e3-e4c9-439b-88af-23d4353afb9d.

Mi solución fue crear un procedimiento almacenado para utilizar para el INSERT. Esta página tiene información sobre cómo hacerlo - http://thedatafarm.com/LearnEntityFramework/tutorials/using-stored-procedures-for-insert-update-amp-delete-in-an-entity-data-model/. Hasta ahora solo tengo un proceso insert insertado, nada para actualizar o eliminar; y al contrario del artículo, no obtengo un error de validación del modelo.

CORRECCIÓN EF me deja por lo que la recuperación de una lista de entidades, pero cuando fui a buscar una instancia de una específica, tengo el error por perder una función de mapeo para las actualizaciones. ¡Uf!

Para recuperar el UUID insertado que se generó con newsequentialid(), utilicé la técnica "OUTPUT INSERTED. [Column]" que se introdujo con SQL Server 2005. Un ejemplo es Retrieve last row inserted with Uniqueidentifier that it is not IDENTITY. Usé la misma técnica en el procedimiento almacenado INSERT para recuperar las columnas de fecha y hora que se establecieron con un getdate predeterminado().

Espero que esto ayude a alguien,

Donnie

+0

para una solución alternativa Utilicé la función Guid.NewGuid() en mi código, por lo que solo genero un GUID para mis nuevas entidades antes de insertarlo. No es secuencial, pero funciona y seguirá funcionando cuando EF cambie en versiones futuras. El impacto en el rendimiento debe ser bajo en las tablas con unos cientos de registros. – mare

0

clic derecho en que .edmx. Abrir con editor de texto XML con codificación u otro. Encuentra el nombre del id y agrega el atributo junto a él en la misma etiqueta: StoreGeneratedPattern = "Identity".

Ejemplo:

< propiedad Name = "WorkerId" type = "uniqueidentifier" "Identidad" anulable = "false" StoreGeneratedPattern = />

Cuestiones relacionadas