7 Pregunta: ¿Por qué obtengo "No se puede insertar un valor explícito para la columna de identidad" en LINQ to SQL cuando no estoy especificando un valor para una columna de identidad?

pregunta creada en Wed, Aug 5, 2009 12:00 AM

Tengo una tabla que se ve así: alt text

ClientID es la única columna de identidad que tengo en la tabla. UserID es una clave principal de FK a una tabla diferente.

Aquí está mi código de inserción de Linq to SQL:

public void InsertClientByUsername(string username, Entities.Client clientInfo)
{

    using (LinqModelDataContext db = new LinqModelDataContext())
    {

        var existingClient = (from client in db.Clients
                              join ext_usr in db.User_Extendeds on client.UserID equals ext_usr.FriendlyUserID
                              join asp_usr in db.aspnet_Users on ext_usr.UserID equals asp_usr.UserId
                              where asp_usr.UserName.ToLower().Equals(username)
                              select client).SingleOrDefault();

        if (existingClient != null)
        {
            existingClient.Address1 = clientInfo.Address1;
            existingClient.Address2 = clientInfo.Address2;
            existingClient.City = clientInfo.City;
            existingClient.CompanyName = clientInfo.CompanyName;
            existingClient.CountryID = clientInfo.CountryID;
            existingClient.FaxNumber = clientInfo.Fax;
            existingClient.FirstName = clientInfo.FirstName;
            existingClient.LastName = clientInfo.LastName;
            existingClient.MailingAttention = clientInfo.Attention;
            existingClient.PhoneNumber = clientInfo.PhoneNumber;
            existingClient.StateID = clientInfo.StateID;
            existingClient.ZipCode = clientInfo.Zip;

        }
        else
        {
            int userID = (from ext_usr in db.User_Extendeds
                          join asp_usr in db.aspnet_Users on ext_usr.UserID equals asp_usr.UserId
                          where asp_usr.UserName.ToLower().Equals(username)
                          select ext_usr.FriendlyUserID).SingleOrDefault();

            Client newClient = new Client();
            newClient.UserID = userID;
            newClient.Address1 = clientInfo.Address1;
            newClient.Address2 = clientInfo.Address2;
            newClient.City = clientInfo.City;
            newClient.CompanyName = clientInfo.CompanyName;
            newClient.CountryID = clientInfo.CountryID;
            newClient.FaxNumber = clientInfo.Fax;
            newClient.FirstName = clientInfo.FirstName;
            newClient.LastName = clientInfo.LastName;
            newClient.MailingAttention = clientInfo.Attention;
            newClient.PhoneNumber = clientInfo.PhoneNumber;
            newClient.StateID = clientInfo.StateID;
            newClient.ZipCode = clientInfo.Zip;

            db.Clients.InsertOnSubmit(newClient);

        }

        db.SubmitChanges();
    }
}

En caso de que tenga curiosidad, la razón por la que tengo todas esas asignaciones es porque estoy traduciendo entre mis objetos de dominio POCO y los objetos generados por linq. En el caso de esta excepción, está tomando la ruta de la sentencia else, creando un nuevo cliente.

Puedes ver que estoy NO tocando la propiedad ClientID, que es la columna de identidad ~ solo ~ en la tabla.

¿Por qué aparece el mensaje "No se puede insertar un valor explícito para la columna de identidad en la tabla 'Cliente' cuando IDENTITY_INSERT está desactivado?

En caso de que sea útil, aquí está mi stacktrace:

  

System.Data.SqlClient.SqlException era   no manejado por el código de usuario
  Mensaje = "No se puede insertar un valor explícito   para la columna de identidad en la tabla 'Cliente'   cuando IDENTITY_INSERT se establece en OFF ".
  Fuente = ". Net SqlClient Data Provider"   ErrorCode = -2146232060 Class = 16
  LineNumber = 1 Number = 544
  Procedure = ""
  Servidor = "192.168.168.190" Estado = 1
  StackTrace:          en System.Data.SqlClient.SqlConnection.OnError (SqlException   excepción, ruptura booleana)          en System.Data.SqlClient.SqlInternalConnection.OnError (SqlException   excepción, ruptura booleana)          en System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject   stateObj)          en System.Data.SqlClient.TdsParser.Run (RunBehavior   runBehavior, SqlCommand cmdHandler,   SqlDataReader dataStream,   BulkCopySimpleResultSet   bulkCopyHandler, TdsParserStateObject   stateObj)          en System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader   ds, RunBehavior runBehavior, String   resetOptionsString)          en System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior   cmdBehavior, RunBehavior runBehavior,   Boolean returnStream, Boolean async)          en System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior   cmdBehavior, RunBehavior runBehavior,   ReturnStream booleano, método de cadena,   Resultado DbAsyncResult)          en System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult   resultado, String methodName, Boolean   sendToPipe)          en System.Data.SqlClient.SqlCommand.ExecuteNonQuery ()          en System.Data.Linq.SqlClient.SqlProvider.Execute (Expresión   consulta, consulta   IObjectReaderFactory factory, Object []   parentArgs, Object [] userArgs,   ICompiledSubQuery [] subQueries, Object   Ultimo resultado)          en System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (Expresión   consulta, QueryInfo []   IObjectReaderFactory factory, Object []   UserArguments, ICompiledSubQuery []   Subconsultas)          en System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (Expresión   consulta)          en System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert (TrackedObject   ít)          en System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert (TrackedObject   ít)          en System.Data.Linq.ChangeProcessor.SubmitChanges (ConflictMode   modo de fallo)          en System.Data.Linq.DataContext.SubmitChanges (ConflictMode   modo de fallo)          en System.Data.Linq.DataContext.SubmitChanges ()          en DomainModel.Repository.Concrete.SqlClientRepository.InsertClientByUsername (String   nombre de usuario, Client ClientInfo)

    
5
  1. Puede usar el Analizador de SQL para ver el SQL generado. Pero no hay mucha duda de que L2S está generando un valor. Eche un vistazo en el código genned (Proyecto | Mostrar todos los archivos) para ver si los metadatos de la columna ClientId realmente tienen el 'marcador de identidad' apropiado (debe estar presente, o debe haber alguna confusión en la versión del archivo ...)
    2009-08-05 14: 52: 26Z
  2. @ Ruben Bartelink, por alguna razón fue un error extraño en mi código generado. Borre mi contexto de datos y lo reconstruí, y esta vez funcionó. Extraño.
    2009-08-05 15: 02: 59Z
  3. Tuve el mismo problema ... SqlDesigner problema, supongo.
    2010-01-19 23: 20: 44Z
7 Respuestas                              7                         

agregar StoreGeneratedPattern = "Identidad" en el archivo .edmx (ver en el editor de texto)

    
4
2009-08-07 18: 21: 49Z

De aquí

Intente configurar "Valor generado automáticamente" en falso

    
1
2009-08-05 15: 05: 36Z

También tuve el mismo problema y al eliminar la tabla y al leerla se corrigió. No sé si la solución no es bonita, ciertamente funcionó y fue muy rápida. Su feo es que hay un error en Linq-to-Sql y Visual Studio 2008 (en mi caso, podría ser un error en otras versiones también), pero al menos es un error que se puede vivir.

    
1
2010-06-25 16: 51: 41Z

Tuve este mismo problema, pero borrar la entidad e importarla de nuevo no me sirvió, lo que causó que tuviera que profundizar aún más. El problema real aquí es que bajo el contenido de SSDL de su diagrama de entidad hay un atributo faltante (StoreGeneratedPattern = "Identidad") que debe estar en la propiedad de ID de su entidad. Una vez que agregues este atributo deberías estar todo listo.

Ejemplo:

<EntityType Name="TABLENAME">
  <Key>
    <PropertyRef Name="ID" />
  </Key>
  <Property Name="ID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
</EntityType>
    
1
2010-10-16 20: 50: 41Z
  1. También está disponible en el editor visual de edmx, si selecciona la columna y ve sus propiedades (en VS 2012, al menos).
    2013-10-21 19: 58: 53Z

Eliminé la tabla de * .dbml en Visual Studio y la inserté nuevamente. ¡El problema anterior está resuelto!

    
1
2012-06-05 03: 11: 41Z

Como dice @Martin, tuve el mismo problema, aunque no tuve que eliminar todo el diagrama para solucionarlo. Todo lo que tenía que hacer era forzar el diagrama para regenerar el código. Esto generalmente es solo una cuestión de cambiar algo en el diagrama y volver a cambiarlo. En casos más graves, he tenido que reiniciar VS o incluso reiniciar para que el diseñador regenere el código.

    
0
2010-06-25 17: 07: 57Z

Intente configurar Read Only a true.

    
0
2012-11-13 07: 46: 31Z
fuente colocada aquí