none
Insert com Entity Framework (tabelas relacionadas) RRS feed

Respostas

  • Bom dessa forma acima é só tira o ctx.SaveChanges() e coloca-lo fora do foreach que ele faz sozinho.....

    Obrigado.

    • Marcado como Resposta Marcos Bazilio sexta-feira, 27 de setembro de 2013 14:19
    sexta-feira, 27 de setembro de 2013 14:18

Todas as Respostas

  • EntidadeA 

    EntidadeB

    EntidadeA.EntidadeB = new EntidadeB(){Nome = "Qualquer coisa"};

    Contexto.EntidadesA.Add(EntidadeA);

    Contexto.SaveChanges();

    terça-feira, 24 de setembro de 2013 14:20
  • Estou fazendo desse jeito, 

    if (verifica == null) 
                    {
                        var f = new funcionario
                        {
                            nomeFuncionario = TB_Nome.Text,
                            dataNascFuncionario = Convert.ToDateTime(TB_DataNas.Text),
                            dataAdmiFuncionario = Convert.ToDateTime(TB_DataAdm.Text),
                            statusFuncionario = "1",
                        };
    
                        ctx.AddTofuncionario(f);                 
    
                        DataTable documentos = new DataTable();
    
                        documentos = Session["tab"] as DataTable;
    
                      
    
                        foreach (DataRow row in documentos.Rows)
                        {
                            var d = new documento
                            {
                                numeroDocumento = row["Documento"].ToString(),
                                validadeDocumento = null,
                                idFuncionario = f.idFuncionario,
                                idTipoDocumento = Convert.ToInt32(row["IdTipoDoc"]),
                            };
    
                            ctx.documento.AddObject(d);                       
                        }
    
                        ctx.SaveChanges();
                    }            
    E não esta indo.. na session esta vindo um datatable de documentos contendo um id e o número do documento

    terça-feira, 24 de setembro de 2013 14:28
  • No segundo for faz isso.

     ctx.Entry<documento>(d).State = System.Data.EntityState.Modified;

    terça-feira, 24 de setembro de 2013 14:56
  • antes do var d ???
    terça-feira, 24 de setembro de 2013 14:59
  • no mesmo lugar que está o ctx.documento.AddObject(d);

    Você vai substituir a linha acima

    terça-feira, 24 de setembro de 2013 15:02
  • Ele não aceita o Entry<documento>....
    terça-feira, 24 de setembro de 2013 15:04
  • Aparece esse erro....

    'Web.BDEntities' does not contain a definition for 'Entry' and no extension method 'Entry' accepting a first argument of type 'Web.BDEntities' could be found (are you missing a using directive or an assembly reference?) C:\Nova pasta\Web\Web_v2\Web\Web\Default.aspx.cs

    terça-feira, 24 de setembro de 2013 15:06
  • Tem ao menos o metodo Entry(d) ?
    terça-feira, 24 de setembro de 2013 15:12
  • Se não houver tenta isso

    ctx.documento.Attach(d);

    ctx.ObjectStateManager.ChangeObjectState(d,EntityState.Modified);

    lembrando que é para entrar no lugar desse ctx.documento.AddObject(d);

    terça-feira, 24 de setembro de 2013 15:17
  • Desculpe a demora, deste jeito também não funcionou, aparece o seguinte erro...

    "A instrução de atualização, inserção ou exclusão de repositório afetou um número inesperado de linhas (0). As entidades podem ter sido modificadas ou excluídas após o carregamento. Atualize as entradas do ObjectStateManager."

    terça-feira, 24 de setembro de 2013 18:15
  • Cara, mais fácil no segundo for você buscar a entidade documento pelo id e setar os valores que você quer e depois adicionar e salvar.

    O problema que está ocorrendo é o seguinte, quando você cria new documento() o entity framework entende que é um novo registro e não um que já existe.


    terça-feira, 24 de setembro de 2013 19:07
  • Mais é um novo, fiz um cadastro único, onde o cara vai cadastrar um funcionário, e nesta tela, ele, pode adicionar vários documentos para o funcionário através de um único campo, onde eu monto o datatable, e no fim ele clica no salvar.... ai rola o insert nas tabelas... 

    Elas estão relacionadas, por isso eu preciso pegar o id do funcionário e jogar na tabela documentos 

    terça-feira, 24 de setembro de 2013 19:28
  • Na entidade Documento tem a propriedade de relacionamento Funcionário?

    Se tiver você faz o seguinte.

    documento.Funcionario = f;

    nao precisa setar o id do funcionario no documento.

    terça-feira, 24 de setembro de 2013 19:39
  • Olá, bom dia..

    onde coloco esse código...?

    quarta-feira, 25 de setembro de 2013 11:52
  • No lugar disso IdFuncionario = f.idFuncionario,

    Colocar isso d.Funcionario = f

    quarta-feira, 25 de setembro de 2013 13:28
  • fiz esse teste, mas tb não funcionou...

    o problema é neste foreach.. fiz dessa forma....

      if (verifica == null)
                    {
    
                        funcionario func = new funcionario
                        {
                            nomeFuncionario = TB_Nome.Text,
                            dataNascFuncionario = Convert.ToDateTime(TB_DataNas.Text),
                            dataAdmiFuncionario = Convert.ToDateTime(TB_DataAdm.Text),
                            statusFuncionario = "1",
                        };
    
                        ctx.AddTofuncionario(func);
                        ctx.SaveChanges();
    
                        DataTable documentos = new DataTable();
    
                        documentos = Session["tab"] as DataTable;
    
                        var cod = (from r in ctx.funcionario
                                   orderby r.idFuncionario descending
                                   select r).First();
    
                        foreach (DataRow row in documentos.Rows)
                        {
                            var doc = new documento
                            {
                                numeroDocumento = row["Documento"].ToString(),
                                validadeDocumento = null,
                                idFuncionario = Convert.ToInt32(cod),
                                idTipoDocumento = Convert.ToInt32(row["IdTipoDoc"]),
                            };
    
                            ctx.AddTodocumento(doc);
                            ctx.SaveChanges();
    
                        }                
    e no foreach dá problema...

    quarta-feira, 25 de setembro de 2013 14:03
  • Resolvi parcialmente o problema, onde a mensagem era em relação a um problema no relacionamento das tabelas, agora só esse foreach que eu tenho que solucionar, pois ele tem que criar o idDocumento toda vez que ele passar pelo foreach..
    quinta-feira, 26 de setembro de 2013 14:10
  • Se o campo IdDocumento estiver como primary key auto indentity não vai rolar de você colocar um Id nele, porque o banco cria automaticamente.

    quinta-feira, 26 de setembro de 2013 14:28
  • Então aqui eu tinha que fazer algum modo de cada passada no foreach ele atribuir o id....
    foreach (DataRow row in documentos.Rows)
                        {
                            documento doc = new documento
                            {
                                numeroDocumento = row["Documento"].ToString(),
                                validadeDocumento = null,
                                idFuncionario = Convert.ToInt32(Session["codigo"]),                      
                                idTipoDocumento = Convert.ToInt32(row["IdTipoDoc"]),
                            };
    
                            ctx.AddTodocumento(doc);
                            ctx.SaveChanges();
    
                        }        

    quinta-feira, 26 de setembro de 2013 14:51
  • Bom dessa forma acima é só tira o ctx.SaveChanges() e coloca-lo fora do foreach que ele faz sozinho.....

    Obrigado.

    • Marcado como Resposta Marcos Bazilio sexta-feira, 27 de setembro de 2013 14:19
    sexta-feira, 27 de setembro de 2013 14:18
  • Passou despercebido, não havia notado rs
    sexta-feira, 27 de setembro de 2013 14:21