none
Consultar ID Identity asignado RRS feed

  • Pregunta

  • No estoy segura de que este sea el foro indicado, si no es así, por favor señálenmelo.

    Resulta que estoy en mi primer proyecto Silverlight 5, SQL, C#, LinqToEntities, WCF, y cuando comencé mi proyecto no sabía nada sobre ninguno de estos temas, así que me apoyé en tutoriales en línea, y en libros.

    Siguiendo uno de estos tutoriales, se autogeneró código para las operaciones CRUD en el lado del servidor en una clase que inicia con:

    [EnableClientAccess()]
    public class MTTODomainContext : LinqToEntitiesDomainService<MTTOEntities>

    y un ejemplo del método INSERT generado para una de mis entidades es:

    public void InsertMtto_ActividadMtto(mtto_ActividadMtto mtto_ActividadMtto)
    {
        if ((mtto_ActividadMtto.EntityState != EntityState.Detached))
        {
            this.ObjectContext.ObjectStateManager.ChangeObjectState(mtto_ActividadMtto, EntityState.Added);
        }
        else
        {
            this.ObjectContext.mtto_ActividadMtto.AddObject(mtto_ActividadMtto);
        }
    }
            El caso es que necesito saber, para cierto fin, una vez que se realizó la actualización, qué ID se le asignó a este objeto, ya que es del tipo Identity y se autogenera una vez hecha la actualización, espero haberme explicado y que alguien me pueda orientar. Saludos y gracias.


    cyndyrdz

    lunes, 11 de enero de 2016 19:36

Respuestas

  • hola

    >>el caso es que yo lo necesito antes de salir del método de InsertMtto_ActividadMtto

    Cuando defines un campo identity en la tabla el secuencial se genera luego de ejecutado el comando INSERT

    o sea no se como es la secuencia en tu codigo, pero hasta que no se efectue la operacion del insert la entidad no asignara el id en la propiedad

    >>debo guardar un registro de auditoría en otra tabla con todos los datos Insertados incluyendo el ID asignado

    si es auditoria porque no creas un trigger en la tabla, asi cuando inserta creara el registro en la otra tabla directamente, o sea no lo resuelves desde codigo sino a nivel de base de datos

    Triggers en Transact SQL

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 13 de enero de 2016 7:45

Todas las respuestas

  • hola

    Cuando insertas el mismo objeto que envias a persistir tendra asignada el id que se genere desde la base de datos

    esto es a modo de ejemplo

    mtto_ActividadMtto entidad = new mtto_ActividadMtto();
    
    xxobj.InsertMtto_ActividadMtto(entidad);
    
    int idgenerado = entidad.Id;
    la misma entidad que envias a persistir cuando sale del metodo deberia tener el id generado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 11 de enero de 2016 21:22
  • hola

    Cuando insertas el mismo objeto que envias a persistir tendra asignada el id que se genere desde la base de datos

    esto es a modo de ejemplo

    mtto_ActividadMtto entidad = new mtto_ActividadMtto();
    
    xxobj.InsertMtto_ActividadMtto(entidad);
    
    int idgenerado = entidad.Id;
    la misma entidad que envias a persistir cuando sale del metodo deberia tener el id generado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

         Muchas gracias Leandro, pero el caso es que yo lo necesito antes de salir del método de InsertMtto_ActividadMtto, pues además de que se agregue la entidad enviada, debo guardar un registro de auditoría en otra tabla con todos los datos Insertados incluyendo el ID asignado a la entidad enviada...


    cyndyrdz

    lunes, 11 de enero de 2016 21:44
  • hola

    >>el caso es que yo lo necesito antes de salir del método de InsertMtto_ActividadMtto

    Cuando defines un campo identity en la tabla el secuencial se genera luego de ejecutado el comando INSERT

    o sea no se como es la secuencia en tu codigo, pero hasta que no se efectue la operacion del insert la entidad no asignara el id en la propiedad

    >>debo guardar un registro de auditoría en otra tabla con todos los datos Insertados incluyendo el ID asignado

    si es auditoria porque no creas un trigger en la tabla, asi cuando inserta creara el registro en la otra tabla directamente, o sea no lo resuelves desde codigo sino a nivel de base de datos

    Triggers en Transact SQL

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 13 de enero de 2016 7:45
  • Muchas gracias por tu respuesta Leandro.

    Entonces con lo que me dices, no hay modo de preguntar por el ID asignado a mi entidad, al final del Método: InsertMtto_ActividadMtto justo antes de salir de él, sino hasta que ya salió?

    Y lo que me comentas de los Triggers, ya lo había contemplado como opción, pero entiendo que funcionan a partir de la versión 2008 de SQL, y la versión que tenemos es 2004, :(

    por esto fue que traté de implementar mi opción, que ya está funcionando correctamente para los casos de UPDATE y DELETE, pero el caso particular del INSERT, tengo este problema para las tablas con ID Identity, pues para cuando hago el registro en mi tabla de auditoría, aún no se ha asignado el ID...


    cyndyrdz

    miércoles, 13 de enero de 2016 15:31
  • Perdón, me equivoqué, la versión que tenemos es SQL 2005, y sí me permitió definir un Trigger, pero ahora mi problema es que no sé cómo asignar el UserName de Windows del usuario que haga el cambio, y no el genérico de la conexión a la BD:

    USE [SICABK]
    GO
    /****** Object:  Trigger [dbo].[TR_mtto_OrdenMtto]    Script Date: 14/01/2016 12:55:24 p. m. ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    ALTER TRIGGER [dbo].[TR_mtto_OrdenMtto] 
       ON  [dbo].[mtto_OrdenMtto] 
       AFTER INSERT
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Insert statements for trigger here
    
    	INSERT INTO mtto_RegistroActividad
    	SELECT SYSTEM_USER, getdate(), 'mtto_OrdenMtto', 'INSERT', '', 
    	RTRIM(cast(ID as char)) + ', ' + 
    	RTRIM(IDUni) + ', ' + 
    	RTRIM(cast(IDCategoriaEquipo as char)) + ', ' +
    	RTRIM(cast(OrdenMantenimiento as char)) + ', ' +
    	RTRIM(ClaveMtto) + ', ' +
    	RTRIM(cast(Mecanico as char)) + ', ' +
    	RTRIM(cast(Electrico as char)) + ', ' +
    	RTRIM(cast(JefeTaller as char)) + ', ' +
    	RTRIM(cast(Operador as char)) + ', ' +
    	RTRIM(OrdenSalida) + ', ' +
    	RTRIM(IsNull(TipoReposicion, 'NULL'))
    	FROM INSERTED
    END
    

    Mi aplicación será una aplicación de escritorio...


    cyndyrdz

    lunes, 18 de enero de 2016 22:43
  • La solución completa la obtuve reuniendo las sugerencias de este post y las que me dieron en otro:

    https://social.msdn.microsoft.com/Forums/es-ES/ddb1832d-c444-43ca-b7f9-add9d30b878d/identificar-usuario-para-utilizarlo-en-un-trigger?forum=sqlserveres

    en este último documenté la versión final. Saludos y gracias


    cyndyrdz

    jueves, 21 de enero de 2016 17:55