Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

NullReferenceException was unhandled

Obtive a mensagem de erro tanto no primeiro código, quanto no segundo:

EntidadesContext contexto = new EntidadesContext();

Produto p = contexto.Produtos.Include(produto => produto.Categoria).FirstOrDefault(produto => produto.ID == 1);

Console.WriteLine(p.Categoria.Nome);
Console.ReadLine();

var categoria = contexto.Categorias.Include(c=> c.Produtos).FirstOrDefault(c => c.ID == 1);

foreach (var p in categoria.Produtos )
{
    Console.WriteLine(p.Nome);
}

Console.ReadLine();

Poderiam me explicar o que pode estar acontecendo? Como já havia mencionado em dúvidas anteriores, possuo o VS2015.

10 respostas

Oi Freedy

Precisamos ter a stacktrace completa, que vai indicar em que linha o erro ocorreu, alem de outras informacoes. E que voce indique qual linha é esse no codigo que voce postou

abracos

1º Código:

System.NullReferenceException was unhandled
  HResult=-2147467261
  Message=Referência de objeto não definida para uma instância de um objeto.
  Source=lojaComEntity
  StackTrace:
       em lojaComEntity.Program.Main(String[] args) na j:\Alura\AspNet MVC 5\visual studio 2012\Projects\lojaComEntity\lojaComEntity\Program.cs:linha 67
       em System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       em System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       em System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       em System.Threading.ThreadHelper.ThreadStart()
  InnerException:

O erro ocorreu na linha: Console.Writeline(p.Categoria.Nome);

2º Código:

System.NullReferenceException was unhandled
  HResult=-2147467261
  Message=Referência de objeto não definida para uma instância de um objeto.
  Source=lojaComEntity
  StackTrace:
       em lojaComEntity.Program.Main(String[] args) na j:\Alura\AspNet MVC 5\visual studio 2012\Projects\lojaComEntity\lojaComEntity\Program.cs:linha 80
       em System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       em System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       em System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       em System.Threading.ThreadHelper.ThreadStart()
  InnerException: 



´EntidadesContext contexto = new EntidadesContext();
             var categoria = contexto.Categorias.Include(c=> c.Produtos).FirstOrDefault(c => c.ID == 1);

             foreach (var p in categoria.Produtos )
             {
                 Console.WriteLine(p.Nome);
             }

             Console.ReadLine();

O erro se dá na linha:

Console.WriteLine(p.Nome);

Nos dois casos ele está retornando o "default", que é null. isso é, nao esta encontrando nenhum produto onde produto => produto.ID == 1 e nem a categoria com aquela restricao. imprima toda a lista, é possivel que ela esteja vindo vazia antes de fazer o firstOrDefault

Já listei tanto o produto, quanto a categoria. Abri a tabela no Banco de dados e consta o ID 1. Segui, exatamente, como orientado no vídeo. Só que não está funcionando. Como não tem como anexar imagem ou anexo no fórum, fica complicado conseguir solução.

Se você fizer print nessas duas coisas, o que acontece?

Console.WriteLine(contexto.Produtos.Include(produto => produto.Categoria));

e

Console.WriteLine(contexto.Categorias.Include(c=> c.Produtos));

ou listando todos esses com o foreach

E se precisar de imagem, use o https://snag.gy/ e poste o link pra gente!

Comando: Console.WriteLine(contexto.Produtos.Include(produto => produto.Categoria));

Resultado: Microsoft.Data.Entity.Internal.InternalDbSet`1[lojaComEntity.Entidades.Produto]

Comando: Console.WriteLine(contexto.Categorias.Include(c=> c.Produtos));

Resultado: Microsoft.Data.Entity.Internal.InternalDbSet`1[lojaComEntity.Entidades.Categoria]

Abaixo, estou colando os scripts das tabelas geradas:

CREATE TABLE [dbo].[Categoria] ( [ID] INT IDENTITY (1, 1) NOT NULL, [Nome] NVARCHAR (MAX) NULL, CONSTRAINT [PK_Categoria] PRIMARY KEY CLUSTERED ([ID] ASC) );

CREATE TABLE [dbo].[Produto] ( [ID] INT IDENTITY (1, 1) NOT NULL, [CategoriaID] INT NOT NULL, [Nome] NVARCHAR (MAX) NULL, [Preco] DECIMAL (18, 2) NOT NULL, CONSTRAINT [PK_Produto] PRIMARY KEY CLUSTERED ([ID] ASC), CONSTRAINT [FK_Produto_Categoria_CategoriaID] FOREIGN KEY ([CategoriaID]) REFERENCES [dbo].[Categoria] ([ID]) ON DELETE CASCADE );

Podem verificar que existe o relacionamento entre elas, Tanto que quando cadastro um produto, a coluna CategoriaID é preenchida.

Abaixo os dados:

Tabela Produto:

ID CategoriaID Nome Preco

1 1 Mouse 20.00 2 1 Teclado 40.00 3 2 Moleton 60.00 4 2 Calça 50.00 5 2 Polo 70.00

Tabela Categoria:

ID Nome 1 Informática 2 Roupas

O projeto pode ser baixado no link abaixo:

https://www.dropbox.com/s/ygpiaarz0sxsn8b/lojaComEntity_bk_20170228_antes_aula05.rar?dl=0

solução!

Olá, Freedy

O problema é que você instalou o Entity Framework 6.1.3 junto com o Entity Framework 7.0.0-rc1-final (que é usado no curso). Por algum motivo, essa instalação cruzada causa um conflito e faz o Entity Framework não carregar as propriedades de navegação produto.Categoria e categoria.Produtos.

Pra resolver isso, você tem que ir em References, clicar sobre o item "EntityFramework" e excluí-lo. Isso remove o EF 6.1.3 que está causando o conflito. Em seguida, você terá problema de compilação por causa do método. Para resolver, importe o namespace a seguir:

using Microsoft.Data.Entity;

Isso deve resolver.

Boa sorte e bons estudos!

Resolveu a questão. Obrigado pela ajuda.