none
ASP NET MVC + Entity Framework RRS feed

  • Pergunta

  • Pessoal
    Comeci a usar ASP NET MVC + Entity Framework essa semana para desenvolver um pequeno portal.
    Em uma determinada tela tenho um relacionamento entre 1 para N (Usuario + Venda) ou seja um usuário pode ter realizado varias vendas
    Quando vou cadastrar uma nova venda criei uma DropDown que tras todos meus usuarios cadastrados até ai tudo blz..

    porem depois de preencher os campos da Venda e clicar em Salvar nao estou conseguindo Salavar o objeto Venda (q contem um Usuario) no banco de dados

    segue o código da classe VendaControler:
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create([Bind(Exclude = "id_venda")] Venda _objVenda)
    {
      try
      {
          _entities.AddToVenda(_objVenda);
          _entities.SaveChanges();
          return RedirectToAction("Index");
      }
      catch(Exception ex)
      {
         throw new Exception(ex.Message);
      }
    }

    o obejto chega da seguinte forma no controler


    _objVenda.id_venda = 0;
    _objVenda._data_venda = 10/10/2000;
    _objVenda._obs_venda = 'teste';
    _objVenda.valor_venda = 10;
    _objVenda.Usuario._id_usuario = 1;

    OBS: os outros campos do objeto _objVenda.Usuario estao todos como null, somente o id_usuario que tem o valor q eu selecionei na dropdown

    porem esta dando o seguinte erro

    ex.InnerException {"Cannot insert the value NULL into column 'nome', table 'D:\\WORK\\PROJECTS\\MVCAPPLICATION3\\MVCAPPLICATION3\\APP_DATA\\LOJA.MDF.dbo.Usuario'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated."} System.Exception {System.Data.SqlClient.SqlException}

    pelo que eu percebi esta tentando cadastrar um novo Usuario, porem eu quero cadastrar uma nova Venda com referencia para um usuário

    será que estou fazendo correto?? é dessa maneira que trabalha com o Entity??

    Fico no aguardo


    http://projetofinal.wordpress.com/
    quinta-feira, 28 de maio de 2009 23:31

Todas as Respostas

  • Olá Chico,

    Como o usuário já existe no context você tem que seleciona-lo , se você não fizer isso ele realmente tenta incluir um novo. Você pode fazer assim, primeiro adicionar mais um parâmetro para sua action que será o id_usuario, e selecionar o usuário por esse id antes de incluir a venda.

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Venda _objVenda,int id_Usuario)
    {
        try
        {
    
            _objVenda.Usuario= _entities.Usuario.Where(x => x.id_usuario == id_Usuario).FirstOrDefault();
            _entities.AddToVenda(_objVenda);
            _entities.SaveChanges();
            _entities.AcceptAllChanges();
    
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }
    







    Se a resposta for útil por favor não esqueça de marca.
    Abraços,
    www.danielfonsecacastro.com.br
    Daniel Fonseca Castro
    sexta-feira, 29 de maio de 2009 12:55
  • Bom Dia Daniel... obrigado pela ajuda.. funcionou perfeitamente...

    porem agora estou com outro problema..... como fazer para carregar uma grid com os dados de Venda e Usuario (Join)

    estou fazendo da seguinte maneira no meu Controler
    public ActionResult Index()
    {
       var _vendaList = (from v in _entities.Venda
                         join u in _entities.Usuario on v.Usuario.id_usuario equals u.id_usuario
                         select v).FirstOrDefault();
       return View(_vendaList);
    }

    só que quando chamo a pagina Index esta dando o seguinte erro

    The model item passed into the dictionary is of type 'MvcApplication3.Models.Venda' but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[MvcApplication3.Models.Venda]'.

    o que pode estar errado? o select esta correto???

    obrigado pela ajuda???

    domingo, 31 de maio de 2009 13:14
  • Olá,

    Você deve trocar o FirstOrDefault por AsEnumerable

    public ActionResult Index()
    {
       var _vendaList = (from v in _entities.Venda
                         join u in _entities.Usuario on v.Usuario.id_usuario equals u.id_usuario
                         select v).AsEnumerable();
       return View(_vendaList);
    }

    Se a resposta for útil por favor não esqueça de marca.
    Abraços,
    www.danielfonsecacastro.com.br
    Daniel Fonseca Castro
    domingo, 31 de maio de 2009 13:22
  • ok.. deu certo..

    porem na minha view quando eu fui selcionar o usuario de uma venda ele nao acha o bjeto porq ele esta null..

    <%

    = Html.Encode(item.Usuario.id_usuario) %>

    os itens de venda traz certinho, mas o usuario que realizou aquela venda nao esta trazendo...

    sera que a qeury esta correta??

    Obrigado!!


    http://projetofinal.wordpress.com/
    domingo, 31 de maio de 2009 13:39
  • Olá,

    Não a sua query não esta certa você tem que selecionar os dados dos usuario também sua query seleciona somente dados de Venda!


    var vendaList = (from v in _entities.Venda
                                     join u in _entities.Usuario on v.Usuario .id_usuario equals u.id_usuario
                                     select new { v.Cliente.id_usuario,v.data_venda,................});

    Se a resposta for útil por favor não esqueça de marca.
    Abraços,
    www.danielfonsecacastro.com.br
    Daniel Fonseca Castro
    domingo, 31 de maio de 2009 14:11
  • Boa Noite Daniel....

    alterei a query porem estou com um erro mais "estranho ainda"

    controller:

    public

     

    ActionResult Index()

    {

     

           var _vendaList = (from v in _entities.Venda

     

           join u in _entities.Usuario on v.Usuario.id_usuario equals u.id_usuario

     

           select new { v.id_venda, v.data_venda, v.valor_venda, v.obs_venda, v.Usuario.id_usuario}).AsEnumerable();

     

           return View(_vendaList);

    }

    View:

    <%

    foreach (var item in Model) { %>

     

     

    <tr>

     

    <td>

           <%

    = Html.ActionLink("Edit", "Edit", new { id=item.id_venda }) %> |

           <%

    = Html.ActionLink("Details", "Details", new { id=item.id_venda })%>

     

    </td>

     

    <td>

           <%

    = Html.Encode(item.id_venda) %>

     

    </td>

     

    <td>

           <%

    = Html.Encode(String.Format("{0:g}", item.data_venda)) %>

     

    </td>

     

    <td>

           <%

    = Html.Encode(String.Format("{0:F}", item.valor_venda)) %>

     

    </td>

     

    <td>

           <%

    = Html.Encode(item.obs_venda) %>

           <%

    = Html.Encode(item.Usuario.id_usuario) %>

     

    </td>

     

    </tr>

    <% } %>


    porem ocorre o seguinte erro:

    The model item passed into the dictionary is of type 'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType0`5[System.Int32,System.DateTime,System.Decimal,System.String,System.Int32]]' but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[MvcApplication3.Models.Venda]'.


    fico no aguardo

    Leandro Prado


    http://projetofinal.wordpress.com/
    quarta-feira, 3 de junho de 2009 01:11
  • Chico: grande dúvida.

    Daniel: obrigado pela ajuda.

    sábado, 29 de maio de 2010 18:58
  • Chico, vc não precisa fazer outra query para os dados do usuario não.

     

    faça apenas isso:

     

    var _vendas = _entities.Venda.Where( ven => ven.Usuario.id_usuario == id);
    
    _vendas.UsuarioReference.Load();
    
    return View(_vendas);


    Contato:albertim_brasil@hotmail.com - Se ajudei, marca como útil.
    Twitter: Me siga!!
    Blog:http://dotnettime.spaces.live.com/

    quarta-feira, 2 de junho de 2010 02:24
  • Daniel,

    Estou com um problema parecido com o do Chico.

    Só que para evitar erros estou somente com uma entidade no banco ainda.

    Nao existe dependencia nenhuma de banco

    Quero somente cadastrar um Aluno.

    A organizaçao está semelhante a do Chico só que dá o mesmo erro.

    Nao está persistindo no banco.

    Anteriormente estava dando erro no SaveChanges()

     

    Obrigado!

    sexta-feira, 24 de setembro de 2010 13:15
  • Debuge e veja se é lançado alguma excessao no savechanges, consulte o inner exception e poste aqui

    Contato:albertim_brasil@hotmail.com - Se ajudei, marca como útil.
    Twitter: Me siga!!
    Blog:http://dotnettime.spaces.live.com/

    sexta-feira, 24 de setembro de 2010 16:11
  • Muito obrigado!

     

    Deu excessao sim

    Logo mais posto o inner exception aí

     

    Abraço

    sexta-feira, 24 de setembro de 2010 18:10