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.

danielovich
fonte
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.

anaximander
fonte
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.

Martin Mulder
fonte
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.

Guy Lowe
fonte
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 ...

Soma Nenhum
fonte
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.

johnny
fonte
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.

Franklin Tarter
fonte
1

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

KennethDale1
fonte
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)
Daniel de Zwaan
fonte
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
Ahmedk
fonte
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).

cunderpants
fonte
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

Muru Bakthavachalam
fonte
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.

Kirsten Greed
fonte
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.

Sunil Jatolia
fonte
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.

Jared G.
fonte
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.

Michael Rivera
fonte
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.

Chamila Maddumage
fonte
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.

RaZzLe
fonte
-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.

Jarin Farhad
fonte
esta é uma péssima idéia
Jason Loki Smith