Tengo un problema con Entity Framework en Asp.net. Quiero obtener el valor de Id cada vez que agrego un objeto a la base de datos. ¿Cómo puedo hacer esto?
c#
entity-framework
entity
ahmet
fuente
fuente
SaveChanges
inmediato solo para obtener la identificación. Lectura adicional aquí .Respuestas:
Es bastante fácil Si está utilizando DB genera identificadores (como
IDENTITY
en MS SQL) sólo tiene que añadir a la entidadObjectSet
ySaveChanges
sobre las enfermedades relacionadasObjectContext
.Id
será llenado automáticamente por usted:El marco de la entidad por defecto sigue a cada uno
INSERT
conSELECT SCOPE_IDENTITY()
cuandoId
se utilizan s generados automáticamente .fuente
Había estado usando la respuesta de Ladislav Mrnka para recuperar con éxito los identificadores cuando usaba el Entity Framework, sin embargo, estoy publicando aquí porque había estado usándolo mal (es decir, usándolo donde no era necesario) y pensé que publicaría mis hallazgos aquí en caso la gente está buscando "resolver" el problema que tuve.
Considere un objeto Order que tenga una relación de clave externa con el Cliente. Cuando agregué un nuevo cliente y un nuevo pedido al mismo tiempo, estaba haciendo algo como esto;
Sin embargo, en mi caso, esto no era necesario porque tenía una relación de clave externa entre customer.Id y order.CustomerId
Todo lo que tenía que hacer era esto;
Ahora, cuando guardo los cambios, la identificación que se genera para el cliente también se agrega al pedido. No necesito los pasos adicionales.
Soy consciente de que esto no responde a la pregunta original, pero pensé que podría ayudar a los desarrolladores que son nuevos en EF a usar en exceso la respuesta más votada para algo que puede no ser necesario.
Esto también significa que las actualizaciones se completan en una sola transacción, evitando potencialmente los datos de orphin (todas las actualizaciones se completan o ninguna lo hace).
fuente
Debe volver a cargar la entidad después de guardar los cambios. Porque ha sido alterado por un disparador de base de datos que EF no puede rastrear. Entonces, necesitamos volver a cargar la entidad desde la base de datos,
Entonces
Mira la respuesta de @jayantha en la siguiente pregunta:
¿Cómo puedo obtener el Id. De la entidad insertada en Entity Framework cuando uso defaultValue?
Mirar la respuesta @christian en la siguiente pregunta también puede ayudar:
Entity Framework Refresh context?
fuente
.GetDatabaseValues();
si acaba de guardar su modelo en la base de datos. La ID debe repoblarse al modelo automáticamente.GetDatabaseValues()
si no conoce la ID del objeto a buscar en la base de datos?Por favor, consulte este enlace.
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
Debe establecer la propiedad de StoreGeneratedPattern en identidad y luego probar su propio código.
O también puedes usar esto.
fuente
StoreGeneratedPattern
fue la pieza que faltaba para mí.El objeto que está guardando debe tener una correcta
Id
después de propagar los cambios en la base de datos.fuente
Puede obtener ID solo después de guardar, en su lugar, puede crear un nuevo Guid y asignarlo antes de guardar.
fuente
Me encuentro con una situación en la que necesito insertar los datos en la base de datos y, al mismo tiempo, necesito la identificación principal utilizando el marco de la entidad. Solución:
fuente
Todas las respuestas son muy adecuadas para sus propios escenarios, lo que hice diferente es que asigné la PK int directamente desde el objeto (TEntity) que Add () devolvió a una variable int como esta;
así que en lugar de crear un objeto completamente nuevo, simplemente toma lo que quieras :)
EDITAR Para el Sr. @GertArnold:
fuente
Add
(si es asíDbSet.Add
) no asigna mágicamente un valor aEmployeeId
.SaveChanges
. Imposible. A menos que tenga algún otro proceso que asigneEmployeeId
, por ejemplo, enEmployee
el constructor. O estás usando EF coreForSqlServerUseSequenceHiLo
. De todos modos, no estás dando la imagen completa.Esto funcionará
fuente
Repository
es. ¡Y "esto funcionará" es una explicación!Hay dos estrategias:
Usar generado por la base de datos
ID
(int
oGUID
)Contras:
Debe realizar
SaveChanges()
para obtener lasID
entidades recién guardadas.Pros:
Puede usar
int
identidad.Usar cliente generado
ID
- solo GUID.Pros: Minificación de
SaveChanges
operaciones. Capaz de insertar un gran gráfico de nuevos objetos por una operación.Contras:
Permitido solo para
GUID
fuente
Cuando usa el código EF 6.x primero
e inicializar una tabla de base de datos, pondrá un
dentro de las propiedades de la tabla debajo del encabezado Valor predeterminado o Enlace, lo que permite que la ID se complete a medida que se inserta.
El problema es si crea una tabla y agrega el
parte posterior, las futuras bases de datos de actualización no volverán a agregar el (newsequentialid ())
Para corregir la forma correcta es borrar la migración, eliminar la base de datos y volver a migrar ... o simplemente puede agregar (newsequentialid ()) en el diseñador de la tabla.
fuente
when -column- is NULL, then NEWID()