La valeur ne peut pas être nulle. Nom du paramètre: source

129

C'est probablement le plus gros problème de perte de temps que j'ai passé des heures à résoudre pendant longtemps.

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();

Cela me donne une erreur de

La valeur ne peut pas être nulle. Nom du paramètre: source

trace de pile

[ArgumentNullException: la valeur ne peut pas être nulle. Nom du paramètre: source] System.Linq.Enumerable.Any ( 1 source, Funcprédicat 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 ... ...

Je veux juste ajouter une entité à la table. L'ORM est EF.

Danielovich
la source
7
Le message d'exception n'est-il pas explicatif? Quelque chose est nul qui ne peut pas être nul. Quel est votre schéma de base de données?
Ash Burlaczenko
Vous voudrez peut-être examiner cette question et ses réponses: stackoverflow.com/questions/3244336/…
Ville Salonen
1
L'une des entrées de collectin a probablement une valeur nulle: est.price = collection ["price"]; est.size = collection ["taille"];
MikeTWebb
1
@AshBurlaczenko oh, vous pensez? Mon schéma semble que chaque colonne peut être nulle.
danielovich
2
Pourriez-vous publier votre chaîne de connexion?
anaximander

Réponses:

42

J'ai eu celui-ci il y a quelque temps, et la réponse n'est pas nécessairement celle à laquelle vous vous attendez. Ce message d'erreur apparaît souvent lorsque votre chaîne de connexion est incorrecte.

Au bout du compte, vous aurez besoin de quelque chose comme ceci:

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

Ce qui se passe, c'est qu'il recherche une source de données au mauvais endroit; Entity Framework le spécifie légèrement différemment. Si vous publiez votre chaîne de connexion et votre configuration EF, nous pouvons vérifier.

anaximandre
la source
2
Dans mon cas, c'était une chaîne de connexion incorrecte dans le code, mais toujours un problème de chaîne de connexion.
jleach
190

Quelque part dans le DbContext se trouve une valeur qui est IEnumerableet est interrogée avec Any()(ou Where()ou Select()ou toute autre méthode LINQ), mais cette valeur l'est null.

Découvrez si vous avez mis une requête ensemble (quelque part en dehors de votre exemple de code) où vous utilisez une méthode LINQ, ou que vous avez utilisé un IEnumerablecomme paramètre qui est NULL.

Martin Mulder
la source
7
Cela a résolu le problème pour moi, je soupçonne que c'est également la solution au PO même si la réponse acceptée est différente.
NibblyPig
4
La réponse pour moi était que je n'avais pas encore initialisé la liste avec laquelle j'essayais de filtrer .Where()- elle l'était toujours null.
Brian Lacy
1
Pour éviter ce genre d'erreurs nulles, vous devez soit essayer de mettre une valeur par défaut dans les propriétés IEnumerable, soit les tester avec Any ()
Fer R
1
Comment est cette réponse avec plus de 140 votes positifs en dessous des autres réponses beaucoup moins bien notées?
nldev
1
Cette réponse est inférieure, car ce n'est pas la réponse acceptée. La première réponse était peut-être la bonne réponse pour l'affiche originale. Cette réponse était peut-être la bonne réponse pour de nombreuses autres personnes.
Martin Mulder
11

Ma raison était différente du reste ici, alors j'ai pensé que je le publierais pour quiconque pourrait avoir ce problème.

J'appelais Count sur une instance de DbSet avec un filtre de null ie

dbSet.Count(null);

J'ai trouvé que passer null ici provoquait l'erreur, alors j'appelle maintenant la méthode sans paramètre si le filtre est nul:

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

Cela a réglé le problème pour moi. Cela peut également être un problème pour toutes les autres méthodes sur DbSet.

Guy Lowe
la source
9

Je viens de recevoir cette erreur exacte dans .Net Core 2.2 Entity Framework car je n'avais pas le set;dans mon DbContextgenre:

public DbSet<Account> Account { get; }

changé en:

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

Cependant, il n'a montré l'exception que lorsque j'ai essayé d'utiliser une requête linq avec Where()et Select()comme d'autres l'ont mentionné ci-dessus.

J'essayais de définir le DbSetcomme lecture seule. Je vais continuer à essayer...

Somme Aucun
la source
1
J'ai juste eu ce problème exact en essayant d'utiliser mon Assembly avec Linqpad. Merci pour cela, j'aurais pu perdre beaucoup plus de temps. .Net Core 3.1 / EF Core 3.1 ici.
Dimanche
3

tout comme un FYI, quelqu'un peut le trouver utile. Je cherchais ma queue pour cette erreur près de 2 jours et je pensais toujours à quelque chose de grand et cherchais les classes qui pourraient être le problème et finalement je l'ai trouvé très stupide et c'était dans mon code de balisage (HTML) dans mypage.ascx . le problème était que j'avais un <asp:EntityDataSource>et cela a une propriété include et j'ai quelques autres tables répertoriées ici et par erreur une table était là qui a été supprimée de la base de données récemment et je n'ai jamais remarqué et elle retournait null avec d'autres entités. Je viens de supprimer la table stupide de la liste d'inclusion et je suis prêt à partir. j'espère que cela peut aider quelqu'un.

johnny
la source
2

Au cas où quelqu'un d'autre se retrouverait ici avec mon problème avec une configuration DB First Entity Framework.

En bref, j'avais besoin de surcharger le constructeur Entities pour accepter une chaîne de connexion, la raison étant la possibilité d'utiliser le conteneur d'injection de dépendances Asp.Net Core en tirant la chaîne de connexion de appsettings.json, plutôt que de l'obtenir comme par magie depuis App.config fichier lors de l'appel du constructeur sans paramètre.

J'ai oublié d'ajouter les appels pour initialiser mes DbSets dans la nouvelle surcharge. Ainsi, le constructeur sans paramètre généré automatiquement ressemblait à ceci:

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

Et ma nouvelle surcharge ressemblait à ceci:

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

La solution était d'ajouter ces initialiseurs dont le code généré automatiquement prend en charge, une simple étape manquée:

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

Cela m'a vraiment jeté pour une boucle parce que certains appels dans notre référentiel qui utilisaient le DbContext fonctionnaient bien (ceux qui n'avaient pas besoin de ces DBSets initialisés), et les autres lançaient l'erreur d'exécution décrite dans l'OP.

Franklin Tarter
la source
1

Assurez-vous que vous injectez le référentiel dans le constructeur du service. Cela a résolu le problème pour moi. :: claque le front ::

KennethDale1
la source
1

Cette exception sera renvoyée si vous essayez de compter les valeurs dans une collection nulle.

Par exemple, le code ci-dessous fonctionne lorsque Error n'est pas nul, mais si Errors est nul, la valeur ne peut pas être nulle. Nom du paramètre: une exception source se produit.

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

Cette exception peut être évitée en vérifiant la valeur null à la place.

if (graphQLResponse.Errors != null)
Daniel de Zwaan
la source
1

Résolu avec la solution suivante

  1. Faites un clic droit sur le edmxfichier, sélectionnez Ouvrir avec, éditeur XML
  2. Localisez l'entité dans l' edmx:StorageModelsélément
  3. Supprimer DefiningQueryentièrement le
  4. Renommez le store:Schema="dbo"en Schema="dbo"(s'il existe)
  5. Supprimer la store:Namepropriété
Ahmedk
la source
Schema = "dbo" à Schema = "dbo" - quoi?
Vincent Buscarello
0

Cela pourrait être aussi idiot que dans mon cas où savechanges a commis une erreur bcoz la base de données n'avait pas de clés étrangères et des associations ont été ajoutées aux tables EDM. J'ai ajouté des clés étrangères dans la base de données et régénéré EDM pour un correctif.

Les erreurs que je voyais sont les suivantes: Cas 1 -> lors de l'utilisation de DBContext pour EDM Message = La valeur ne peut pas être nulle. Nom du paramètre: source à System.Linq.Enumerable.Any [TSource] ( 1 source, Funcprédicat IEnumerable 2)

Cas 2 -> lors de l'utilisation d'ObjectContext pour EDM Message = Impossible de mettre à jour l'EntitySet 'Contact' car il a un DefiningQuery et aucun élément n'existe dans l'élément pour prendre en charge l'opération en cours.

(Je voulais juste le jeter là-dedans au cas où cela aiderait quelqu'un).

cunderpants
la source
0

Dans MVC, l'écran d'affichage appelle la méthode qui se trouve dans Controller ou Repository.cs et attribue une valeur de retour à n'importe quel contrôle dans CSHTML mais cette méthode n'est en fait pas implémentée dans .cs / controller, puis CSHTML lèvera l'exception de paramètre NULL

Muru Bakthavachalam
la source
0

J'ai eu cette erreur lorsque j'avais un type non valide pour une propriété d'entité.

public Type ObjectType {get;set;}

Lorsque j'ai supprimé la propriété, l'erreur a cessé de se produire.

Kirsten Greed
la source
0

Dans mon cas, le problème est survenu lors de la configuration de l'application Web sur IIS.Lorsque la commande de mise à jour sur un enregistrement a été déclenchée, cette erreur a été générée.

C'était un problème d'autorisation sur App_Data qui était en lecture seule. Cliquez avec le bouton droit sur le dossier, décochez la case Lecture seule et vous avez terminé. À propos, à des fins de test, j'utilisais la base de données localdb qui se trouvait dans le dossier App_Data.

Sunil Jatolia
la source
0

Mon erreur a été d'oublier d'ajouter le .ThenInclude (s => s.SubChildEntities) sur le parent .Include (c => c.SubChildEntities) à l'action Controller lors de la tentative d'appeler les SubChildEntities dans la vue Razor.

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

Il convient de noter que IntelliSense de Visual Studio 2017 Community ne récupère pas l'objet SubChildEntities dans l'expression lambda dans le .ThenInclude (). Cependant, il compile et s'exécute avec succès.

Jared G.
la source
0

Je sais que c'est loin de l'année 2013 de la question, mais ce symptôme peut apparaître si le chargement différé n'est pas activé lors de la migration d'une application ASP.NET 5 vers ASP.NET Core, puis en essayant de mettre à niveau vers Entity Framework Core 2.x (à partir d'EF 6). Entity Framework Core a déplacé la prise en charge du proxy de chargement différé vers un package distinct , vous devez donc l'installer.

Cela est particulièrement vrai si tout ce que vous avez chargé est un package Entity Framework Core Sql Server (qui active Entity Framework très bien).

Après avoir installé le package de proxies, puis, comme le disent les documents, .UseLazyLoadingProxies()appelez le générateur d'options DbContext (dans votre section de configuration de démarrage DI, ou partout où vous configurez votre DbContext), et la propriété de navigation qui lançait l'exception ci-dessus cessera de la lancer, et fonctionnera comme Entity Framework 6.

Michael Rivera
la source
J'ai commencé dans cette voie et dans certains scénarios, cela pourrait fonctionner, mais je suis tombé assez rapidement sur ce stackoverflow.com/questions/41881169
...
0

J'ai eu le même problème avec XUnit. Le problème était avec ma connexion à la base de données. Vérifiez que votre chaîne de connexion est correcte ou non.

Chamila Maddumage
la source
0

Et, dans mon cas, je définis à tort mes deux colonnes différentes comme des identités sur les configurations DbContext comme ci-dessous,

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

Quand je le corrige comme ci-dessous,

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

Je me suis également débarrassé de cette erreur.

RaZzLe
la source
-3

Prenez une ligne dans la base de données et rendez toute la colonne nulle dans cette ligne comme ceci "NULL". Passez maintenant cette valeur NULL en utilisant try catch ou if else.

Jarin Farhad
la source
c'est une idée terrible
Jason Loki Smith