C'est probablement le plus gros problème de perte de temps que j'ai passé des heures à résoudre depuis 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
stacktrace de
[ArgumentNullException: la valeur ne peut pas être null. Nom du paramètre: source] System.Linq.Enumerable.Any (prédicat IEnumerable
1 source, Func
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.
J'avais celui-ci il y a quelque temps et la réponse ne correspond pas nécessairement à ce à quoi vous vous attendiez. Ce message d'erreur apparaît souvent lorsque votre chaîne de connexion est incorrecte.
À un moment donné, vous aurez besoin de quelque chose comme ça:
<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>
Qu'est-ce qui se passe, c'est qu'il cherche 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.
Quelque part dans DbContext se trouve une valeur qui est IEnumerable
et est interrogée avec Any()
(ou Where()
ou Select()
ou toute autre méthode LINQ), mais cette valeur est null
.
Déterminez si vous avez mis en place une requête (quelque part en dehors de votre exemple de code) où vous utilisez une méthode LINQ ou si vous avez utilisé un paramètre IEnumerable
en tant que paramètre NULL.
Ma raison était différente du reste ici, alors j'ai pensé le publier pour toute autre personne susceptible d'avoir ce problème.
J'appelais Compter sur une instance de DbSet avec un filtre de null i.e.
dbSet.Count(null);
J'ai trouvé que passer à null ici était à l'origine de l'erreur. J'appelle maintenant la méthode sans paramètre si le filtre est null:
if (filter == null)
{
return dbSet.Count();
}
else
{
return dbSet.Count(filter);
}
Cela a réglé le problème pour moi. Cela peut également poser problème pour toute autre méthode sur DbSet.
tout comme un FYI, quelqu'un peut le trouver utile. Je poursuivais ma queue pour cette erreur presque 2 jours et je pensais toujours à quelque chose de gros et je cherchais les classes qui pourraient être la cause du problème. Finalement, je l’ai trouvée 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 qu’il possédait une propriété include et que d’autres tables étaient énumérées ici; par erreur, il y avait une table qui avait été supprimée de la base de données récemment et que je n’ai jamais remarquée et renvoyant null avec d’autres entités. Je viens de retirer la table stupide de la liste d'inclusion et je suis prêt à partir. J'espère que cela peut aider quelqu'un.
Au cas où quelqu'un d'autre se retrouverait ici avec mon problème avec une configuration DB First Entity Framework.
En résumé, je devais surcharger le constructeur Entities pour accepter une chaîne de connexion. La raison en était la possibilité d'utiliser un conteneur d'injection de dépendance Asp.Net Core pour extraire la chaîne de connexion depuis appsettings.json, plutôt que de l'obtenir 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. Le constructeur sans paramètre généré automatiquement ressemble à 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 consistait à ajouter les initialiseurs pris en charge par le code généré automatiquement, une simple étape manquée:
public MyEntities(string connectionString)
: base(connectionString)
{
Set1 = Set<MyDbSet1>();
Set2 = Set<MyDbSet2>();
}
Cela m’a vraiment bouleversé, car certains appels de notre Respository qui utilisaient DbContext fonctionnaient bien (ceux qui n’avaient pas besoin de ces DBSets initialisés) et les autres renvoyaient l’erreur d’exécution décrite dans l’OP.
Résolu avec la solution suivante
Assurez-vous d'injecter le référentiel dans le constructeur du service. Cela l'a résolu pour moi. :: pointe le front ::
Prenez une ligne dans la base de données et rendez la colonne nuls dans cette ligne comme ceci: "NULL" .Maintenant, transmettez cette valeur NULL avec try catch ou if else.
Dans MVC, l'écran View appelle une méthode qui se trouve dans Controller ou Repository.cs et attribue une valeur de retour à tout contrôle de CSHTML mais cette méthode n'est en réalité pas implémentée dans .cs/controller. CSHTML lève l'exception de paramètre NULL.
Je sais que la question est loin de l’année 2013, mais ce symptôme peut apparaître si le chargement paresseux n’est pas activé lors de la migration d’une application ASP.NET 5 vers ASP.NET Core, puis lors d’une tentative de mise à niveau vers Entity Framework Core 2.x (à partir de EF 6). Entity Framework Core a déplacé la prise en charge du proxy par chargement paresseux dans un package séparé , 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 fonctionne parfaitement avec Entity Framework).
Après l’installation du paquetage de proxies, appelez .UseLazyLoadingProxies()
dans le générateur d’options DbContext (comme indiqué dans la documentation, dans la section relative à la configuration de la DI de démarrage ou à l’endroit où vous configurez votre DbContext), ainsi qu’à la propriété de navigation générant l’exception ci-dessus. cessera de le lancer, et fonctionnera comme le faisait Entity Framework 6.
Mon erreur a été d’oublier d’ajouter le .ThenInclude (s => s.SubChildEntities) au parent .Include (c => c.SubChildEntities) à l’action Controller en tentant d’appeler 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 qu'IntelliSense de Visual Studio 2017 Community ne récupère pas l'objet SubChildEntities dans l'expression lambda dans .ThenInclude (). Il réussit cependant à compiler et à exécuter.
Cela pourrait être aussi ridicule que dans mon cas où savechanges se trompait bcoz, la base de données ne possédait pas de clé étrangère et des associations étaient 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 dans System.Linq.Enumerable.Any [TSource] (prédicat IEnumerable1 source, Func
2)
Cas 2 -> lors de l'utilisation de ObjectContext for EDM Message = Impossible de mettre à jour l'entité EntitySet 'Contact' car elle contient une DefiningQuery et qu'aucun élément n'existe dans l'élément prenant en charge l'opération en cours.
(Je voulais juste le jeter là au cas où cela aiderait quelqu'un).
J'ai eu cette erreur quand 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é.
Dans mon cas, le problème est apparu lors de la configuration de l'application Web sur IIS. Lorsque la commande de mise à jour de n'importe quel enregistrement a été déclenchée, cette erreur s'est produite.
Il s'agissait d'un problème d'autorisation sur App_Data, défini en lecture seule. Cliquez avec le bouton droit sur le dossier, décochez la case en lecture seule et vous avez terminé. A propos, à des fins de test, j'utilisais la base de données localdb qui se trouvait dans le dossier App_Data.
Je viens de recevoir cette erreur exacte dans .Net Core 2.2 Entity Framework parce que je n'avais pas le set;
dans mon DbContext
comme ceci:
public DbSet<Account> Account { get; }
changé en:
public DbSet<Account> Account { get; set;}
Cependant, l'exception n'a pas été affichée jusqu'à ce que j'essaie d'utiliser une requête linq avec Where()
et Select()
comme d'autres l'avaient mentionné plus haut.
J'essayais de définir le DbSet
en lecture seule. Je vais continuer à essayer...