none
Inclusão usando LINQ to Entities RRS feed

  • Pergunta

  • Olá,

    Estou usando LINQ to Entities juntamente com o banco de dados NorthWind, querendo fazer uma nova inclusão de produto associando a uma determinada categoria.

    Segue abaixo o meu código:

    var cat = new Categories()
                    {
                        CategoryID = Convert.ToInt16(cboCategoria.SelectedValue)
                    };

    var novoProduto = new Products
                    {
                        Categories = cat,
                        ProductName = txtProduto.Text.Trim(),
                        UnitPrice = Convert.ToDecimal(txtPreco.Text.Trim()),
                        UnitsInStock = Convert.ToInt16(txtQuantidade.Text.Trim())

                    };

                    ef.AddToProducts(novoProduto);

                    ef.SaveChanges();


    //

    O problema que acontece é que ele tenta criar uma nova categoria também, alguém pode me ajudar ? 

    Detalhe: Eu retirei o código do livro de Renato Haddad - Livro de LINQ (SQL e Entity) com C# 3, já enviei e-mail para o mesmo, após demora para responder, o autor não deu devido atenção ao caso, nem se quer verificou se o código do seu livro está errado ou não, pois reproduzi o código exato do livro dele, e quando respondeu ainda mandou eu procurar no google sobre o método Attach (triste pela falta de compromisso do autor).

    Tércio Padilha
    segunda-feira, 19 de outubro de 2009 12:50

Respostas

  • Tércio ja sei o erro, está = mas é ==, ficando assim, não consegui baixar o seu projeto:

    Categories cat = (from category in ef.Categories where category.CategoryID == Convert.ToInt16(cboCategoria.SelectedValue) select category).First();
    terça-feira, 3 de novembro de 2009 20:18

Todas as Respostas

  • Olá

    Tércio, assumindo q a categoria q vc quer associar ao produto já esteja cadastrada no banco, e q vc quer "pegar" o valor da combo pra gravar na tabela de produtos, eu tentaria o seguinte:

    Products novoProduto = new Products
    {
        novoProduto.CategoriesReference.EntityKey = new EntityKey ("1*.Categories","2*",Convert.ToInt32(cboCategoria.SelectedValue));
        ProductName = txtProduto.Text.Trim(),
        UnitPrice = Convert.ToDecimal(txtPreco.Text.Trim()),
        UnitsInStock = Convert.ToInt16(txtQuantidade.Text.Trim())

    };

    ef.AddToProducts(novoProduto);

    ef.SaveChanges();


    PS: 1* - nome do entity; 2* - nome do campo chave da tabela de Categorias.

    segunda-feira, 19 de outubro de 2009 14:26
  • Olá Chistina,

    Agradeço pela atenção, mas não consegui êxito, essa linha: novoProduto.CategoriesReference.EntityKey = new EntityKey ("1*.Categories","2*",Convert.ToInt32(cboCategoria.SelectedValue)); o Visual Studio não interpreta corretamente, mesmo substituindo o nome do entity e o nome do campo, nem mesmo se eu digitar novoProduto (dentro do construtor) ele aparece intellisense para o mesmo.

    Tércio Padilha
    segunda-feira, 19 de outubro de 2009 18:15
  • Ninguém tem uma solução ?
    Tércio Padilha
    terça-feira, 20 de outubro de 2009 20:38
  • Tércio acredito que se você usar o ID somente em vez da Categorias dará certo:

    var novoProduto = new Products
                    {
                        CategoryID = Convert.ToInt16(cboCategoria.SelectedValue)
    ProductName = txtProduto.Text.Trim(), UnitPrice = Convert.ToDecimal(txtPreco.Text.Trim()), UnitsInStock = Convert.ToInt16(txtQuantidade.Text.Trim()) };
    quarta-feira, 21 de outubro de 2009 00:36
  • Tércio me desculpa te respondi como LINQ 2 SQL, abaixo a soluáo com EF:

    Categories cat = (from category in ef.Categories where ef.CategoryID = Convert.ToInt16(cboCategoria.SelectedValue) select category).First();

    var novoProduto = new Products
                    {
                        Categories = cat,
                        ProductName = txtProduto.Text.Trim(),
                        UnitPrice = Convert.ToDecimal(txtPreco.Text.Trim()),
                        UnitsInStock = Convert.ToInt16(txtQuantidade.Text.Trim())

                    };

    Acredito que esse código funcione.
    • Sugerido como Resposta Ari C. Raimundo quarta-feira, 21 de outubro de 2009 11:37
    quarta-feira, 21 de outubro de 2009 00:59
  • Olá Murilo, 

    Agradeço pela tentativo, mas novamente não deu certo, ele dá erro nesse código:

    Categories cat = (from category in ef.Categories where ef.CategoryID = Convert.ToInt16(cboCategoria.SelectedValue) select category).First();

    Tércio Padilha
    sexta-feira, 23 de outubro de 2009 12:37
  • Qual o erro?
    sexta-feira, 23 de outubro de 2009 15:10
  • Vou anexar o erro em imagem.

    http://www.2ti.com.br/img/erro-linq.PNG

    Por favor me ajudem.

    Tércio Padilha
    terça-feira, 27 de outubro de 2009 12:30
  • Tércio está meio ruim a qualidade, por favor me passe o nome que você está usando do binding context, como chama os campos e as tabelas e os tipos de cada um.
    terça-feira, 27 de outubro de 2009 12:32
  • O que está acontecendo é que você não possui aquele campo CategoryId também, o que eu passei foi so um exemplo, você tem que ver como chama seus campos. A qualidade está boa não se preocupe.
    Por favor me passe os campos da sua tabela Categories e products. E como chama o seu gerenciador do entity framework.

    Por exemplo MinhasEntidadeEntiites ef = new MinhaEntidadesEntities();
    Você me passaria ef
    terça-feira, 27 de outubro de 2009 12:36
  • Olá Murilo, gostaria de agradecer desde já o seu empenho em me ajudar.

    O gerenciador é ef mesmo:
    NorthwindEntities ef = new NorthwindEntities();

    E o campo CategoryId existe sim.

    Eu não entendo pq ele não adiciona.

    Tércio Padilha
    terça-feira, 3 de novembro de 2009 11:42
  • A sua consulta tem que ser:

    Categories cat = (from category in ef.Categories where category.CategoryID ...)

    Agora que eu analisei melhor, não é ef.CategoryID e sim category.CategoryID

    Categories cat = (from category in ef.Categories where category.CategoryID = Convert.ToInt16(cboCategoria.SelectedValue) select category).First();
    terça-feira, 3 de novembro de 2009 12:10
  • Olá Murilo,

    Na linha: 
    Categories cat = (from category in ef.Categories where category.CategoryID = Convert.ToInt16(cboCategoria.SelectedValue) select category).First();

    Ele dá o seguinte erro na parte do where:
    Cannot convert lambda expression to type 'string' because it is not a delegate type
    Delegate 'System.Func<LivroLINQ.Categories,int,bool>' does not take '1' argument
    Cannot implicitly convert type 'int' to 'bool'




    Tércio Padilha
    terça-feira, 3 de novembro de 2009 19:53
  • Vou anexar o meu projeto, o erro acontece no frmInsert

    http://www.2ti.com.br/img/LivroLINQ.zip

    Tércio Padilha
    terça-feira, 3 de novembro de 2009 19:56
  • Tércio ja sei o erro, está = mas é ==, ficando assim, não consegui baixar o seu projeto:

    Categories cat = (from category in ef.Categories where category.CategoryID == Convert.ToInt16(cboCategoria.SelectedValue) select category).First();
    terça-feira, 3 de novembro de 2009 20:18
  • Olá Murilo,

    Muito obrigado.

    Tércio Padilha
    quinta-feira, 5 de novembro de 2009 12:42