Error updating Entity entries

0

Iamtryingtoinsertsomedatafromsomefilesbytheentity,howeveritgivesthiserror:

Method:

internalvoidAddArquivo(Model.Arquivoarquivo){using(varctx=newTESTEntities()){varversao=arquivo.ArquivoVersoes[0];ctx.ARQUIVO.Add(newARQUIVO(){ARQUIVO_GUID=arquivo.ARQUIVO_GUID,ARQUIVO_VERSAO=newARQUIVO_VERSAO(){ARQUIVO_GUID=arquivo.ARQUIVO_GUID,ARQUIVO_VERSAO_GUID=versao.ARQUIVO_VERSAO_GUID,ARQUIVO=versao.ARQUIVO,DATAHORA=versao.DATAHORA,TAMANHO=versao.TAMANHO,USUARIO_PESSOA_GUID=versao.USUARIO_PESSOA_GUID},DIRETORIO_GUID=arquivo.DIRETORIO_GUID,EXTENSAO=arquivo.EXTENSAO,IS_STREAM=arquivo.IS_STREAM,TAG=arquivo.TAG,TIPO_DE_ARQUIVO_GUID=arquivo.TipoDeArquivo.TIPO_DE_ARQUIVO_GUID,ULT_ARQUIVO_VERSAO_GUID=arquivo.ULT_ARQUIVO_VERSAO_GUID,URL=arquivo.URL,XARQUIVO=arquivo.XARQUIVO});ctx.SaveChanges();}}}ERRO:"Erro ao atualizar as entradas. Consulte a exceção interna para obter detalhes."

remembering that my primary keys are like varchar, and are not identity

System.Data.Entity.Infrastructure.DbUpdateException was caught HResult=-2146233087 Message=Erro ao atualizar as entradas. Consulte a exceção interna para obter detalhes. Source=EntityFramework StackTrace: em     
System.Data.Entity.Internal.InternalContext.SaveChanges() em InnerException: 
System.Data.UpdateException HResult=-2146233087 Message=Erro ao atualizar as entradas. Consulte a exceção interna para obter detalhes. Source=System.Data.Entity StackTrace: em 
System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) em 
System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) em 
System.Data.Entity.Internal.InternalContext.SaveChanges() InnerException: 
System.Data.SqlClient.SqlException HResult=-2146232060 Message=Violation of PRIMARY KEY constraint 'ARQUIVO_VERSAO_PK'. Cannot insert duplicate key in object TEST.ARQUIVO_VERSAO'. The statement has been terminated. Source=.Net SqlClient Data Provider ErrorCode=-2146232060 Class=14 LineNumber=1 Number=2627 Procedure="" Server=192.168.10.59 State=1 StackTrace: em 
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action'1 wrapCloseInAction) em 
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) em 
System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) em 
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) em 
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) em System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource'1 completion, Int32 timeout, Task& task, Boolean asyncWrite) em 
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource'1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) em 
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() em 
System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary'2 identifierValues, List'1 generatedValues) em 
System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) InnerException:
    
asked by anonymous 09.02.2015 / 14:06

2 answers

0

The error is quite clear:

System.Data.SqlClient.SqlException HResult=-2146232060 Message=Violation of PRIMARY KEY constraint 'ARQUIVO_VERSAO_PK'. Cannot insert duplicate key in object TEST.ARQUIVO_VERSAO'. The statement has been terminated. 

It means that here:

            ARQUIVO_VERSAO = new ARQUIVO_VERSAO()
            {
                ARQUIVO_GUID = arquivo.ARQUIVO_GUID,
                ARQUIVO_VERSAO_GUID = versao.ARQUIVO_VERSAO_GUID, // Isto já existe no banco
                ARQUIVO = versao.ARQUIVO,
                DATAHORA = versao.DATAHORA,
                TAMANHO = versao.TAMANHO,
                USUARIO_PESSOA_GUID = versao.USUARIO_PESSOA_GUID
            },

The right thing would be for you to generate a new Guid for each new version you entered. Since the column is String , you still need one more conversion:

            ARQUIVO_VERSAO = new ARQUIVO_VERSAO()
            {
                ARQUIVO_GUID = arquivo.ARQUIVO_GUID,
                ARQUIVO_VERSAO_GUID = Guid.NewGuid().ToString(),
                ARQUIVO = versao.ARQUIVO,
                DATAHORA = versao.DATAHORA,
                TAMANHO = versao.TAMANHO,
                USUARIO_PESSOA_GUID = versao.USUARIO_PESSOA_GUID
            },
    
09.02.2015 / 14:52
0

You are attempting to insert an existing ARCHIVE object, in which case you need to check if it already exists in the Database. You can do it as follows:

using (var ctx = new TESTEntities())
{
    var versaoAux = arquivo.ArquivoVersoes[0];
    var versao = ctx.ARQUIVO_VERSAO.Find(versaoAux.ARQUIVO_VERSAO_GUID);
    if (versao == default(ARQUIVO_VERSAO)) 
    {       
        versao = new ARQUIVO_VERSAO()
        {
            ARQUIVO_GUID = arquivo.ARQUIVO_GUID,
            ARQUIVO_VERSAO_GUID = versaoAux.ARQUIVO_VERSAO_GUID,
            ARQUIVO = versaoAux.ARQUIVO,
            DATAHORA = versaoAux.DATAHORA,
            TAMANHO = versaoAux.TAMANHO,
            USUARIO_PESSOA_GUID = versaoAux.USUARIO_PESSOA_GUID
        };
    }

    ctx.ARQUIVO.Add(new ARQUIVO()
    {
        ARQUIVO_GUID = arquivo.ARQUIVO_GUID,
        ARQUIVO_VERSAO = versao,
        DIRETORIO_GUID = arquivo.DIRETORIO_GUID,
        EXTENSAO = arquivo.EXTENSAO,
        IS_STREAM = arquivo.IS_STREAM,
        TAG = arquivo.TAG,
        TIPO_DE_ARQUIVO_GUID = arquivo.TipoDeArquivo.TIPO_DE_ARQUIVO_GUID,
        ULT_ARQUIVO_VERSAO_GUID = arquivo.ULT_ARQUIVO_VERSAO_GUID,
        URL = arquivo.URL,
        XARQUIVO = arquivo.XARQUIVO
    });
    ctx.SaveChanges();
}
    
09.02.2015 / 14:56