Usuário com melhor resposta
ADO.DataServices, Entity Framework, Silverligth Insert ID FK relacionamento.

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 - VarcharTabela 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{
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;
Produtos newProd = new Produtos
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
{
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
privatevoid 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.
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- Sugerido como Resposta Marcelo Paiva - Softprime terça-feira, 27 de outubro de 2009 15:39
- Marcado como Resposta Johny Wercley terça-feira, 27 de outubro de 2009 16:37
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- Sugerido como Resposta Marcelo Paiva - Softprime terça-feira, 27 de outubro de 2009 15:39
- Marcado como Resposta Johny Wercley terça-feira, 27 de outubro de 2009 16:37
-
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....