Pregunta ¿Por qué me aparece "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?


Tengo una mesa que se ve así: alt text

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

Aquí está mi código de inserción de Linq a 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 soy NO tocando la propiedad ClientID que es la columna ~ solo ~ identidad en la tabla.

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

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

System.Data.SqlClient.SqlException fue   no manejado por el código de usuario
  Mensaje = "No se puede insertar valor explícito   para la columna de identidad en la tabla 'Cliente'   cuando IDENTITY_INSERT está establecido en OFF. "
  Fuente = ". Proveedor de datos net SqlClient"   ErrorCode = -2146232060 Clase = 16
  LineNumber = 1 Number = 544
  Procedimiento = ""
  Servidor = "192.168.168.190" Estado = 1
  StackTrace:          en System.Data.SqlClient.SqlConnection.OnError (SqlException   excepción, Boolean breakConnection)          en System.Data.SqlClient.SqlInternalConnection.OnError (SqlException   excepción, Boolean breakConnection)          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 (Expression   consulta, QueryInfo queryInfo,   Fábrica IObjectReaderFactory, objeto []   parentArgs, Object [] userArgs,   ICompiledSubQuery [] subQueries, Object   Ultimo resultado)          en System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (Expression   consulta, QueryInfo [] consultaInfos,   Fábrica IObjectReaderFactory, objeto []   userArguments, ICompiledSubQuery []   Subconsultas)          en System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (Expression   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, cliente clientInfo)


5
2017-08-05 14:36


origen


Respuestas:


agregue StoreGeneratedPattern = "Identidad" en el archivo .edmx (vista en el editor de texto)


4
2017-08-07 18:21



De aquí

Intente configurar "Valor generado automáticamente" en falso


1
2017-08-05 15:05



También tuve el mismo problema y al eliminar la tabla y leerla, se solucionó. No sé si la solución no es bonita, ciertamente funcionó y fue muy rápida. Su aspecto feo es 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
2018-06-25 16:51



Tuve este mismo problema, pero borrar la entidad e importarla de nuevo no me sirvió, lo que provocó 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
2017-10-16 20:50



Eliminé la tabla de * .dbml en Visual Studio y la volví a insertar. el problema anterior está resuelto!


1
2018-06-05 03:11



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


0
2018-06-25 17:07



Intenta configurar Read Only a true.


0
2017-08-05 15:46