Valor não pode ser nulo. Nome do parâmetro: source


129

Este é provavelmente o maior problema de perda de tempo que passei horas resolvendo por um longo tempo.

var db = new hublisherEntities();
establishment_brands est = new establishment_brands();

est.brand_id = 1;
est.establishment_id = 1;
est.price = collection["price"];
est.size = collection["size"];

db.establishment_brands.Add(est);
db.SaveChanges();

Isso me dá um erro de

Valor não pode ser nulo. Nome do parâmetro: source

stacktrace de

[ArgumentNullException: o valor não pode ser nulo. Nome do parâmetro: source] System.Linq.Enumerable.Any ( 1 source, Funcpredicado IEnumerable 2) +4083335 System.Data.Entity.Internal.InternalContext.WrapUpdateException (UpdateException updateException) +87
System.Data.Entity.Internal.InternalContext.SaveChanges () + 193
System.Data.Entity.Internal.LazyInternalContext.SaveChanges () +33
System.Data.Entity.DbContext.SaveChanges () +20 ... ...

Eu só quero adicionar uma entidade à tabela. O ORM é EF.


7
A mensagem de exceção não é explicativa? Algo é nulo que não pode ser nulo. Qual é o seu esquema db?
precisa saber é o seguinte

Você pode querer olhar para esta pergunta e suas respostas: stackoverflow.com/questions/3244336/…
Ville Salonen 29/04

1
Provavelmente uma das entradas em collectin possui um valor nulo: est.price = collection ["price"]; est.size = coleção ["tamanho"];
MikeTWebb

1
@AshBurlaczenko oh, você acha? Meu esquema parece que todas as colunas podem ser nulas.
Danielovich 29/04

2
Você poderia postar sua string de conexão?
Anaximander

Respostas:


42

Eu tinha esse há um tempo, e a resposta não é necessariamente o que você esperaria. Essa mensagem de erro geralmente aparece quando a string de conexão está incorreta.

No palpite, você precisará de algo assim:

<connectionStrings>
    <add name="hublisherEntities" connectionString="Data Source=localhost;Initial Catalog=hublisher;Integrated Security=True;" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
            <parameter value="Data Source=localhost;Initial Catalog=hublisher;Integrated Security=True" />
        </parameters>
    </defaultConnectionFactory>
</entityFramework>

O que está acontecendo é que ele está procurando uma fonte de dados no lugar errado; O Entity Framework especifica um pouco diferente. Se você publicar sua string de conexão e a configuração EF, podemos verificar.


2
No meu caso, era uma string de conexão incorreta no código, mas ainda assim é um problema de string de conexão.
jleach

190

Em algum lugar dentro do DbContext há um valor que é IEnumerablee é consultado com Any()( Where()ou Select()ou qualquer outro método LINQ), mas esse valor é null.

Descubra se você montou uma consulta (em algum lugar fora do código de exemplo) em que está usando um método LINQ ou se usou IEnumerableum parâmetro como NULL.


7
Isso resolveu o problema para mim, suspeito que essa seja a solução para o OP, mesmo que a resposta aceita seja diferente.
NibblyPig

4
A resposta para mim foi que eu ainda não havia inicializado a lista com a qual estava tentando filtrar .Where()- ainda estava null.
Brian Lacy

1
Para evitar esse tipo de erro nulo, tente colocar um valor padrão nas propriedades IEnumerable ou testá-los com Any ()
Fer R

1
Como é esta resposta com mais de 140 votações abaixo das outras respostas com classificações muito mais baixas?
Nldev 03/07/19

1
Esta resposta é mais baixa, porque não é a resposta aceita. A primeira resposta foi possivelmente a resposta certa para o pôster original. Esta resposta foi possivelmente a resposta certa para muitas outras pessoas.
Martin Mulder

11

Meu motivo era diferente do resto aqui, então pensei em publicá-lo para qualquer pessoa que possa ter esse problema.

Eu estava chamando Count em uma instância do DbSet com um filtro nulo ou seja

dbSet.Count(null);

Descobri que a passagem de nulo aqui estava causando o erro, por isso agora chamo o método sem parâmetros se o filtro for nulo:

 if (filter == null)
 {
     return dbSet.Count();
 }
 else
 {
     return dbSet.Count(filter);
 }

Isso resolveu o problema para mim. Isso pode ser um problema para outros métodos no DbSet também.


9

Eu só tenho esse erro exata em .Net Núcleo 2.2 Entity Framework, porque eu não tinha a set;no meu DbContextassim:

public DbSet<Account> Account { get; }

alterado para:

public DbSet<Account> Account { get; set;}

No entanto, ele não mostrou a exceção até que tentei usar uma consulta linq com Where()e Select()como outras pessoas mencionaram acima.

Eu estava tentando definir o DbSetcomo somente leitura. Vou continuar tentando ...


1
Eu apenas tive esse problema exato ao tentar usar meu Assembly com o Linqpad. Obrigado por isso, eu poderia ter perdido muito mais tempo. .Net Core 3.1 / EF Core 3.1 aqui.
domingo

3

assim como um FYI, alguém pode achar útil. Eu estava perseguindo meu rabo por esse erro quase 2 dias e estava sempre pensando em algo grande e procurando as classes que poderiam ser o problema. Finalmente, achei o problema muito estúpido e estava no meu código de marcação (HTML) em mypage.ascx . o problema era que eu tenho um <asp:EntityDataSource>e isso tem uma propriedade include e eu tenho algumas outras tabelas listadas aqui e por engano havia uma tabela que foi excluída do banco de dados recentemente e eu nunca notei e ele retornou nulo com outras entidades. Acabei de remover a tabela estúpida da lista de inclusão e estou pronto para ir. espero que isso possa ajudar alguém.


2

Caso alguém mais acabe aqui com o meu problema com uma instalação do DB First Entity Framework.

Para encurtar a história, eu precisava sobrecarregar o construtor Entities para aceitar uma cadeia de conexão, o motivo é a capacidade de usar o contêiner de injeção de dependência do Asp.Net Core retirando a cadeia de conexão de appsettings.json, em vez de obtê-la magicamente no App.config ao chamar o construtor sem parâmetros.

Esqueci de adicionar as chamadas para inicializar meus DbSets na nova sobrecarga. Portanto, o construtor gerado sem parâmetros e gerado automaticamente se parecia com isso:

    public MyEntities()
        : base("name=MyEntity")
    {
        Set1 = Set<MyDbSet1>();
        Set2 = Set<MyDbSet2>();
    }

E minha nova sobrecarga ficou assim:

    public MyEntities(string connectionString)
        : base(connectionString)
    {
    }

A solução foi adicionar os inicializadores que o código gerado automaticamente cuida, uma simples etapa perdida:

     public MyEntities(string connectionString)
        : base(connectionString)
    {
        Set1 = Set<MyDbSet1>();
        Set2 = Set<MyDbSet2>();
    }

Isso realmente me impressionou, porque algumas chamadas em nosso repositório que usavam o DbContext funcionaram bem (aquelas que não precisavam dos DBSets inicializados) e outras lançaram o erro de tempo de execução descrito no OP.


1

Certifique-se de injetar o repositório no construtor do serviço. Isso resolveu para mim. :: cheira testa ::


1

Essa exceção será retornada se você tentar contar valores em uma coleção nula.

Por exemplo, o abaixo funciona quando Erros não é nulo, no entanto, se Erros for nulo, o Valor não poderá ser nulo. Nome do parâmetro: ocorre uma exceção de origem .

if (graphQLResponse.Errors.Count() > 0)

Essa exceção pode ser evitada verificando-se nulo.

if (graphQLResponse.Errors != null)

1

Resolvido com a seguinte solução

  1. Clique com o botão direito do mouse no edmxarquivo, selecione Abrir com, editor XML
  2. Localize a entidade no edmx:StorageModelselemento
  3. Remova DefiningQuerycompletamente
  4. Renomeie o store:Schema="dbo"para Schema="dbo"(se existir)
  5. Remova a store:Namepropriedade

Esquema = "dbo" para Esquema = "dbo" - o que?
27618 Vincent Buscarello

0

Poderia ser tão tolo quanto no meu caso, onde as alterações de saves estavam errando bcoz, o db não tinha chaves estrangeiras e associações foram adicionadas às tabelas EDM. Adicionei chaves estrangeiras no banco de dados e registei o EDM para uma correção.

Os erros que eu estava vendo são os seguintes: Caso 1 -> ao usar DBContext para EDM Message = Value não pode ser nulo. Nome do parâmetro: source em System.Linq.Enumerable.Any [TSource] ( 1 source, Funcpredicado IEnumerable 2)

Caso 2 -> ao usar o ObjectContext para EDM Message = Não é possível atualizar o EntitySet 'Contact' porque ele possui um DefiningQuery e nenhum elemento existe no elemento para oferecer suporte à operação atual.

(Só queria jogá-lo lá no caso de ajudar alguém).


0

No MVC, a tela View está chamando o método que está no Controller ou Repository.cs e atribuindo valor de retorno a qualquer controle no CSHTML, mas esse método não é realmente implementado no .cs / controller, então o CSHTML lançará a exceção do parâmetro NULL


0

Eu recebi esse erro quando tinha um tipo inválido para uma propriedade de entidade.

public Type ObjectType {get;set;}

Quando removi a propriedade, o erro parou de ocorrer.


0

No meu caso, o problema apareceu ao configurar o aplicativo Web no IIS. Quando o comando update em qualquer registro foi acionado, esse erro foi gerado.

Foi um problema de permissão no App_Data que foi definido como somente leitura. Clique com o botão direito do mouse na pasta, desmarque a caixa de seleção Somente leitura e pronto. A propósito, para fins de teste, eu estava usando o banco de dados localdb que estava na pasta App_Data.


0

Meu erro foi esquecer de adicionar o .ThenInclude (s => s.SubChildEntities) ao pai .Include (c => c.SubChildEntities) à ação Controller ao tentar chamar o SubChildEntities na visualização Razor.

var <parent> = await _context.Parent
            .Include(c => c.<ChildEntities>)
            .ThenInclude(s => s.<SubChildEntities>)
            .SingleOrDefaultAsync(m => m.Id == id);

Deve-se observar que o IntelliSense da Comunidade do Visual Studio 2017 não seleciona o objeto SubChildEntities na expressão lambda no .ThenInclude (). Porém, ele compila e executa com sucesso.


0

Sei que esse é um longo caminho desde o ano de 2013 da pergunta, mas esse sintoma pode aparecer se você não tiver o carregamento lento ativado ao migrar um aplicativo ASP.NET 5 para o ASP.NET Core e tentar atualizar para Entity Framework Core 2.x (da EF 6). O Entity Framework Core mudou o suporte a proxy de carregamento lento para um pacote separado , portanto você precisa instalá-lo.

Isso é particularmente verdadeiro se tudo o que você carregou é um pacote do Entity Framework Core Sql Server (que ativa o Entity Framework muito bem).

Depois de instalar o pacote de proxies, invoque .UseLazyLoadingProxies()o construtor de opções do DbContext (na seção Configuração da DI de inicialização ou onde quer que você configure o DbContext), e a propriedade de navegação que estava lançando a exceção acima parará de lançá-lo, e funcionará como o Entity Framework 6 costumava.


Comecei por esse caminho e, em alguns cenários, pode funcionar, mas me deparei com isso muito rapidamente: stackoverflow.com/questions/41881169/…
infocyde

0

Eu tive o mesmo problema com o XUnit. O problema estava com minha conexão com o banco de dados. Verifique se a seqüência de conexão está correta ou não.


0

E, no meu caso, defini por engano minhas duas colunas diferentes como identidades nas configurações do DbContext, como abaixo,

builder.HasKey(e => e.HistoryId).HasName("HistoryId");
builder.Property(e => e.Id).UseSqlServerIdentityColumn(); //History Id should use identity column in this example

Quando eu o corrijo como abaixo,

builder.HasKey(e => e.HistoryId).HasName("HistoryId");
builder.Property(e => e.HistoryId).UseSqlServerIdentityColumn();

Eu também me livrei desse erro.


-3

Pegue uma linha no banco de dados e torne toda a coluna nula nessa linha como este "NULL". Agora, passe esse valor NULL usando try catch ou se houver outra coisa.


esta é uma péssima idéia
Jason Loki Smith
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.