none
ADO.DataServices, Entity Framework, Silverligth Insert ID FK relacionamento. RRS feed

  • Pergunta

  • ADO.DataServices, Entity Framework, Silverligth Insert ID FK relacionamento.

    Olá Pessoal, estou com a seguinte dificuldade.
    Criando um Model EntityFramework, ele identifica o relacionamento.

    Quero simplismente inserir uma informação na tabela de produto. mais não estou conseguindo
    inserir o ID categoria na tabela de produto..alguém pode ajudar?
    O ID preciso fazer uma busca pelo nome na tabela de categoria, capturando o ID apos inserir este ID na tabela de produtos.
    Já tentei varias formas e nada, estou quase para remover o relacionamento no EF =//
    Meu codigo segue abaixo.

    +----------+
    |Categoria|             
    +----------+
    |CatID      |<-+
    |Nome      |    |
    +----------+    |
                         |
    +-------+        |
    |Produto|        |
    +-------+        |
    |ProdID |       |
    |Nome   |       |
    |CatID  |@---+
    +-------+

    Tenho as seguintes tabelas relacionadas acima.
    =============== Tipos ========================
    Tabela Categoria:
    CatID - Auto Identity
    Nome  - Varchar

    Tabela Produto:
    ProdID - Auto Identity
    Nome   - Varchar

    =============== Informações select ===========
    +----------+
    |Categoria |
    +-----+----+
    |CatID|Nome|
    +-----+----+
    | 1   |AAAA|
    | 2   |BBBB|
    | 3   |CCCC|
    +-----+----+

    +------------------------+
    |      Produto              |
    +------+---------+-----+
    |ProdID|Nome   |CatID|
    +------+---------+-----+
    | 1      |Café      |1      |
    | 2      |Garrafa  |3      |
    | 3      |Cadeira  |2      |
    | 4      |Copo     |3       |
    +------+-------+--------+

    ===============================================

    using

     

    System.Data.Services.Client;
    using EFADO.ServiceReference1;

    namespace

    EFADO{

     

    EFADO{

    EFADO{

     


    public partial class MainPage : UserControl
    {

     

    // Membros var 
    private
    Entities contextEntities;
    private Produtos currentProduto;
    private Categorias currentCategoria;

     

    public MainPage()

    {
    InitializeComponent();
    // Contexto
    contextEntities =

    new Entities(new Uri("http://localhost:1334/WebDataService1.svc", UriKind.RelativeOrAbsolute));
    contextEntities.MergeOption =
    MergeOption.AppendOnly;
    }

     

    // Botão teste para salvar
    private
    void Salvar_Click(object sender, RoutedEventArgs e)
    {

     

    var queryConferenceOpen = from confOpen in contextEntities.Categoria
    where confOpen.Nome == "BBBB" // Filtro vem de um autocompletebox
    select confOpen;

     

    var selectedConferenceOpen = (DataServiceQuery<Categorias>)queryConferenceOpen;
    selectedConferenceOpen.BeginExecute(ar =>
    {
    var co = selectedConferenceOpen.EndExecute(ar).First();
    this.currentCategoria = co;
    },
    null);// 1º Tentativa sem Sucesso.. buscando ID da categoria via LINQ e tentando inserir no Tab Prod

    Produtos newProd = new Produtos
    {
    Nome =
    "Novo Produto",
    Categoria =
    this.currentCategoria // Como colocar o ID buscando pelo nome digitado pelo usuario???
    };

     

    // 2º Tentativa sem Sucesso.. buscando ID da categoria via Lambda Expression
     EProdutos
    newProd = new Produtos();
    newProd.Nome =
    "Novo Produto";
    newProd.Categoria = contextEntities.Categoria.Where(cat => cat.Nome ==
    "BBBB").First();

    // Chamada async medoto OnChangesSaved
    contextEntities.AddToProduto(newProd);
    contextEntities.BeginSaveChanges(

    SaveChangesOptions.Batch,OnChangesSaved, contextEntities);
    this.currentProduto = newProd;

    }

    // Medoto OnChangesSaved
    private

     

    void OnChangesSaved(IAsyncResult result)
    {
    Dispatcher.BeginInvoke(() =>
    {
    contextEntities = result.AsyncState
    as Entities;

    try
    {// Complete the save changes operation and display the response.
    contextEntities.EndSaveChanges(result);
    }

    catch (DataServiceRequestException ex)
    {
    // Display the error from the response.MessageBox.Show(ex.Response.ToString());}

     

    catch (InvalidOperationException ex)
    {
    MessageBox.Show(ex.Message.ToString());}

    finally
    {MessageBox.Show("teste ok");}});

    }

     

    }
    }

     

     Estou um bom tempo tentando.. se poderem ajudar agradeceria muito.

     Estou um bom tempo tentando.. se poderem ajudar agradeceria muito.

     

     

     

    terça-feira, 27 de outubro de 2009 13:15

Respostas

Todas as Respostas

  • Olá,

    Você deverá fazer o link entre os objetos, veja um exemplo no artigo que escrevi para o DevGoiás.Net:

    http://www.devgoias.net/artigo_ler.aspx?ID=40

    Lá estou fazendo um link entre o "Tipo de Categoria" com "Categoria", basicamente antes de executar o "SaveChanges" deve-se executar o "SetLink"

    Se ainda tiver dúvidas é só postar!

    Até Mais!

    Marcelo Paiva
    terça-feira, 27 de outubro de 2009 15:21
  • Nossa.... Como a falta de informação é complicada, uma simples linha resolveu meu problema.
    Muito Obrigado Marcelo.. funcionou na boa.

    Outro detalhe Marcelo, Se poder ajudar.

    Estou excluindo dados com seguinte codigo abaixo.
    Só que essa exclusão é para somente uma linha. pesquisada pelo linq no codigo.
    Agora gostaria de excluir varias linha encontrado feito apartir de um linq.

    .Excluir ProdutoID = 9
    .Excluir todos da CategoriaID = 2


    Excluindo somente um PRoduto ID.
    private void Excluir_Click(object sender, RoutedEventArgs e)
    {

     

    var queryProdutos = from p in contextEntities.Produto
    where p.ProdutoID == 9
    select p;

     

    var selectProduto = (DataServiceQuery<Produtos>)queryProdutos;
    selectProduto.BeginExecute(ar =>
    {
    var pr = selectProduto.EndExecute(ar).First();
    this.currentProduto = pr;
    },
    null);

    contextEntities.DeleteObject(

    this.currentProduto);
    contextEntities.BeginSaveChanges(
    SaveChangesOptions.Batch,OnChangesSaved, contextEntities);
    this.currentProduto = null;

    }

    Como excluir todos os produtos da categoriaID = 2????
    Devo fazer algum foreach no comando DeleteObject? um Array no Contexto? e poder ajudar mais uma vez.

     

    private void Excluir_Click(object sender, RoutedEventArgs e)
    {
    var queryProdutos = from p in contextEntities.Produto
    where p.Categoria.CategoriaID == 2
    select p;

     

    var selectProduto = (DataServiceQuery<Produtos>)queryProdutos;
    selectProduto.BeginExecute(ar =>
    {
    var pr = selectProduto.EndExecute(ar).First();
    this.currentProduto = pr;
    },
    null);

    contextEntities.DeleteObject(

    this.currentProduto);
    contextEntities.BeginSaveChanges(
    SaveChangesOptions.Batch,
    OnChangesSaved, contextEntities);

     

    this.currentProduto = null;
    }

     

    Abraços....






    terça-feira, 27 de outubro de 2009 16:37