Solucionado (ver solução)
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.