El valor no puede ser nulo. Nombre del parámetro: fuente

129

Este es probablemente el mayor problema de pérdida de tiempo que he pasado horas resolviendo durante mucho tiempo.

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

Esto me da un error de

El valor no puede ser nulo. Nombre del parámetro: fuente

rastro de

[ArgumentNullException: el valor no puede ser nulo. Nombre del parámetro: fuente] System.Linq.Enumerable.Any (IEnumerable 1 source, Func2 predicate) +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 ... ...

Solo quiero agregar una entidad a la tabla. El ORM es EF.

danielovich
fuente
77
¿No es explicativo el mensaje de excepción? Algo es nulo que no puede ser nulo. ¿Cuál es tu esquema de base de datos?
Ash Burlaczenko
Es posible que desee analizar esta pregunta y sus respuestas: stackoverflow.com/questions/3244336/…
Ville Salonen
1
Probablemente una de las entradas en collectin tiene un valor nulo: est.price = collection ["price"]; est.size = collection ["size"];
MikeTWebb
1
@AshBurlaczenko oh, ¿crees? Mi esquema parece que cada columna puede ser nula.
danielovich
2
¿Podría publicar su cadena de conexión?
anaximandro

Respuestas:

42

Tuve este hace un tiempo, y la respuesta no es necesariamente lo que esperarías. Este mensaje de error a menudo aparece cuando la cadena de conexión es incorrecta.

Supongo que necesitarás algo como esto:

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

Lo que sucede es que está buscando una fuente de datos en el lugar equivocado; Entity Framework lo especifica de forma ligeramente diferente. Si publica su cadena de conexión y configuración de EF, entonces podemos verificar.

anaximandro
fuente
2
En mi caso, era una cadena de conexión incorrecta en el código, pero aún así era un problema de cadena de conexión.
jleach
190

En algún lugar dentro de la DbContext es un valor que es IEnumerabley se consulta con Any()(o Where()o Select()o cualquier otro LINQ-método), pero este valor es null.

Averigüe si realiza una consulta (en algún lugar fuera de su código de ejemplo) donde está utilizando un método LINQ, o si utilizó un IEnumerableparámetro como NULL.

Martin Mulder
fuente
77
Esto resolvió el problema para mí, sospecho que esta es la solución para el OP también a pesar de que la respuesta aceptada es diferente.
NibblyPig
44
La respuesta para mí fue que aún no había inicializado la Lista con la que intentaba filtrar .Where(), todavía estaba null.
Brian Lacy
1
Para evitar este tipo de errores nulos, debe intentar poner un valor predeterminado en las propiedades IEnumerable o probarlos con Any ()
Fer R
1
¿Cómo es esta respuesta con más de 140 votos a favor debajo de las otras respuestas con calificaciones mucho más bajas?
nldev
1
Esta respuesta es más baja, porque no es la respuesta aceptada. La primera respuesta fue posiblemente la respuesta correcta para el póster original. Esta respuesta fue posiblemente la respuesta correcta para muchas otras personas.
Martin Mulder
11

Mi razón era diferente al resto aquí, así que pensé en publicarlo para cualquier otra persona que pudiera tener este problema.

Estaba llamando a Count en una instancia de DbSet con un filtro de nulo, es decir

dbSet.Count(null);

Descubrí que pasar nulo aquí estaba causando el error, así que ahora llamo al método sin parámetros si el filtro es nulo:

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

Esto solucionó el problema para mí. Esto también puede ser un problema para cualquier otro método en DbSet.

Guy Lowe
fuente
9

Acabo de recibir este error exacto en .Net Core 2.2 Entity Framework porque no tenía el set;de mi DbContextgusto:

public DbSet<Account> Account { get; }

cambiado a:

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

Sin embargo, no mostró la excepción hasta que intenté usar una consulta linq con Where()y Select()como otros habían mencionado anteriormente.

Estaba tratando de configurar el DbSetcomo solo lectura. Seguiré intentando...

Suma ninguno
fuente
1
Acabo de tener este problema exacto al intentar usar mi ensamblaje con Linqpad. Gracias por esto, podría haber perdido mucho más tiempo. .Net Core 3.1 / EF Core 3.1 aquí.
Domingo
3

solo como FYI, alguien puede encontrarlo útil. Estuve persiguiendo mi cola por este error casi 2 días y siempre estaba pensando en algo grande y buscando las clases que podrían ser el problema y finalmente encontré un problema muy estúpido y estaba en mi código de marcado (HTML) en mypage.ascx . el problema fue que tengo un <asp:EntityDataSource>y esto tiene una propiedad de inclusión y tengo algunas otras tablas enumeradas aquí y, por error, había una tabla que se eliminó de la base de datos recientemente y nunca me di cuenta y regresó nulo con otras entidades. Acabo de eliminar la estúpida tabla de la lista de inclusión y estoy listo. Espero que esto pueda ayudar a alguien.

johnny
fuente
2

En caso de que alguien más termine aquí con mi problema con una configuración de DB First Entity Framework.

En pocas palabras, necesitaba sobrecargar el constructor de Entidades para aceptar una cadena de conexión, la razón es la capacidad de usar el contenedor de inyección de dependencia Asp.Net Core que extrae la cadena de conexión de appsettings.json, en lugar de obtenerla mágicamente de App.config archivo al llamar al constructor sin parámetros.

Olvidé agregar las llamadas para inicializar mis DbSets en la nueva sobrecarga. Entonces, el constructor sin parámetros generado automáticamente se parecía a esto:

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

Y mi nueva sobrecarga se veía así:

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

La solución fue agregar esos inicializadores de los que se ocupa el código generado automáticamente, un simple paso perdido:

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

Esto realmente me dejó sin aliento porque algunas llamadas en nuestro repositorio que usaron el DbContext funcionaron bien (las que no necesitaban esos DBSets inicializados), y las otras arrojaron el error de tiempo de ejecución descrito en el OP.

Franklin Tarter
fuente
1

Asegúrese de inyectar el repositorio en el constructor del servicio. Eso lo resolvió para mí. :: golpea la frente ::

KennethDale1
fuente
1

Esta excepción se devolverá si intenta contar valores en una colección nula.

Por ejemplo, lo siguiente funciona cuando los errores no son nulos, sin embargo, si los errores son nulos, el valor no puede ser nulo. Nombre del parámetro: se produce una excepción de origen .

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

Esta excepción se puede evitar comprobando si hay nulo.

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

Resuelto con la siguiente solución

  1. Haga clic derecho en el edmxarchivo, seleccione Abrir con, editor XML
  2. Localiza la entidad en el edmx:StorageModelselemento
  3. Eliminar por DefiningQuerycompleto
  4. Cambie el nombre de store:Schema="dbo"a Schema="dbo"(si existe)
  5. Eliminar la store:Namepropiedad
Ahmedk
fuente
Schema = "dbo" a Schema = "dbo" - ¿qué?
Vincent Buscarello
0

Podría ser tan tonto como en mi caso donde savechanges estaba fallando porque la base de datos no tenía claves foráneas y se agregaron asociaciones a las tablas EDM. Agregué claves foráneas en el DB y regenere EDM para una solución.

Los errores que estaba viendo son los siguientes: Caso 1 -> cuando uso DBContext para EDM Mensaje = El valor no puede ser nulo. Nombre del parámetro: fuente en System.Linq.Enumerable.Any [TSource] (IEnumerable 1 source, Func2 predicate)

Caso 2 -> cuando se utiliza ObjectContext para EDM Mensaje = No se puede actualizar el EntitySet 'Contact' porque tiene un DefiningQuery y no existe ningún elemento en el elemento para admitir la operación actual.

(Solo quería tirarlo allí en caso de que ayude a alguien).

cunderpants
fuente
0

En MVC, la pantalla Ver llama al método que está en Controller o Repository.cs y asigna el valor de retorno a cualquier control en CSHTML pero ese método no está implementado en .cs / controller, luego CSHTML arrojará la excepción del parámetro NULL

Muru Bakthavachalam
fuente
0

Recibí este error cuando tenía un tipo no válido para una propiedad de entidad.

public Type ObjectType {get;set;}

Cuando eliminé la propiedad, el error dejó de ocurrir.

Avaricia Kirsten
fuente
0

En mi caso, el problema apareció al configurar la aplicación web en IIS. Cuando se activó el comando de actualización en cualquier registro, se generó este error.

Fue un problema de permiso en App_Data que se configuró en solo lectura. Haga clic con el botón derecho en la carpeta, desactive la casilla de verificación Solo lectura y ya está. Por cierto, para fines de prueba, estaba usando la base de datos localdb que estaba en la carpeta App_Data.

Sunil Jatolia
fuente
0

Mi error fue olvidar agregar .ThenInclude (s => s.SubChildEntities) en el padre .Include (c => c.SubChildEntities) a la acción del controlador al intentar llamar a SubChildEntities en la vista Razor.

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

Cabe señalar que IntelliSense de Visual Studio 2017 Community no recoge el objeto SubChildEntities en la expresión lambda en .ThenInclude (). Sin embargo, se compila y ejecuta con éxito.

Jared G.
fuente
0

Sé que esto está muy lejos del año 2013 de la pregunta, pero este síntoma puede aparecer si no tiene habilitada la carga diferida al migrar una aplicación ASP.NET 5 a ASP.NET Core y luego intentar actualizar a Entity Framework Core 2.x (de EF 6). Entity Framework Core ha trasladado la compatibilidad del proxy de carga diferida a un paquete separado , por lo que debe instalarlo.

Esto es particularmente cierto si todo lo que ha cargado es un paquete de Entity Framework Core Sql Server (que activa Entity Framework muy bien).

Después de instalar el paquete proxies, entonces, como dicen los documentos, invoque .UseLazyLoadingProxies()en el generador de opciones DbContext (en su sección de configuración DI de inicio, o donde configure su DbContext), y la propiedad de navegación que arrojó la excepción anterior dejará de arrojarlo, y funcionará como solía Entity Framework 6.

Michael Rivera
fuente
Empecé por este camino y en algunos escenarios podría funcionar, pero me encontré con esto rápidamente stackoverflow.com/questions/41881169/…
infocyde
0

Tuve el mismo problema con XUnit. El problema fue con la conexión de mi base de datos. Verifique que su cadena de conexión sea correcta o no.

Chamila Maddumage
fuente
0

Y, en mi caso, defino por error mis dos columnas diferentes como identidades en las configuraciones de DbContext como a continuación,

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

Cuando lo corrijo como a continuación,

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

También me he librado de este error.

Borrachera
fuente
-3

Tome una fila en la base de datos y haga que toda la columna sea nula en esa fila como esta "NULL". Ahora pase ese valor NULL usando try catch o si no.

Jarin Farhad
fuente
esta es una idea terrible
Jason Loki Smith