Il valore non può essere nullo. Nome del parametro: sorgente


129

Questo è probabilmente il più grande problema di perdita di tempo che ho trascorso ore a risolvere a lungo.

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

Questo mi dà un errore di

Il valore non può essere nullo. Nome del parametro: sorgente

stacktrace di

[ArgumentNullException: il valore non può essere nullo. Nome parametro: source] System.Linq.Enumerable.Any ( 1 source, Funcpredicato 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 ... ...

Voglio solo aggiungere un'entità alla tabella. L'ORM è EF.


7
Il messaggio di eccezione non è esplicativo? Qualcosa è nullo che non può essere nullo. Qual è il tuo schema db?
Ash Burlaczenko,

Potresti voler esaminare questa domanda e le sue risposte: stackoverflow.com/questions/3244336/…
Ville Salonen,

1
Probabilmente una delle voci in collectin ha un valore nullo: est.price = collection ["price"]; est.size = collection ["size"];
MikeTWebb,

1
@AshBurlaczenko oh, pensi? Il mio schema sembra che ogni colonna possa essere nulla.
danielovich,

2
Potresti pubblicare la tua stringa di connessione?
anaximander

Risposte:


42

Ho avuto questo poco tempo fa e la risposta non è necessariamente quella che ti aspetteresti. Questo messaggio di errore si verifica spesso quando la stringa di connessione è errata.

A indovinare, avrai bisogno di qualcosa del genere:

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

Quello che sta succedendo è che sta cercando un'origine dati nel posto sbagliato; Entity Framework lo specifica in modo leggermente diverso. Se pubblichi la stringa di connessione e la configurazione EF, possiamo verificare.


2
Nel mio caso si trattava di una stringa di connessione errata nel codice, ma comunque un problema di stringa di connessione.
jleach

190

Da qualche parte all'interno di DbContext c'è un valore che è IEnumerableed è interrogato con Any()( Where()o Select()o qualsiasi altro metodo LINQ), ma questo valore è null.

Scopri se metti insieme una query (da qualche parte al di fuori del tuo codice di esempio) in cui stai usando un metodo LINQ o se hai usato un IEnumerableparametro come NULL.


7
Ciò ha risolto il problema per me, sospetto che questa sia la soluzione anche al PO, anche se la risposta accettata è diversa.
NibblyPig,

4
La risposta per me è stata che non avevo ancora inizializzato l'Elenco con cui stavo tentando di filtrare .Where()- era ancora null.
Brian Lacy,

1
Per evitare questo tipo di errori nulli, dovresti provare a inserire un valore predefinito nelle proprietà IEnumerable o testarli con Any ()
Fer R

1
In che modo questa risposta con oltre 140 voti al di sotto delle altre risposte con un punteggio molto più basso?
nldev,

1
Questa risposta è più bassa, perché non è la risposta accettata. La prima risposta è stata forse la risposta giusta per il poster originale. Questa risposta è stata forse la risposta giusta per molte altre persone.
Martin Mulder,

11

La mia ragione era diversa dalle altre qui, quindi ho pensato di pubblicarla per chiunque potesse avere questo problema.

Stavo chiamando Count su un'istanza di DbSet con un filtro di null ie

dbSet.Count(null);

Ho scoperto che passare null qui stava causando l'errore, quindi ora chiamo il metodo senza parametri se il filtro è null:

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

Questo ha risolto il problema per me. Questo potrebbe essere un problema per qualsiasi altro metodo su DbSet.


9

Ho appena ricevuto questo errore esatto in .Net Core 2.2 Entity Framework perché non avevo il set;mio DbContextcosì:

public DbSet<Account> Account { get; }

cambiato in:

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

Tuttavia, non ha mostrato l'eccezione fino a quando non ho provato a utilizzare una query linq con Where()e Select()come altri avevano già menzionato sopra.

Stavo cercando di impostare la DbSetsola lettura. Continuerò a provare ...


1
Ho appena avuto questo esatto problema durante il tentativo di utilizzare il mio assembly con Linqpad. Grazie per questo, avrei potuto perdere molto più tempo. .Net Core 3.1 / EF Core 3.1 qui.
Domenica

3

proprio come un FYI, qualcuno potrebbe trovarlo utile. Stavo inseguendo la mia coda per questo errore da quasi 2 giorni e pensavo sempre a qualcosa di grosso e cercavo le classi che potrebbero essere il problema e alla fine l'ho trovato molto stupido ed era nel mio codice mark up (HTML) in mypage.ascx . il problema era che ho un <asp:EntityDataSource>e questo ha una proprietà include e ho alcune altre tabelle elencate qui e erroneamente c'era una tabella che è stata eliminata dal database di recente e non l'ho mai notato e restituisce null con altre entità. Ho appena rimosso la tabella stupida dall'elenco di inclusione e sono a posto. spero che questo possa aiutare qualcuno.


2

Nel caso in cui qualcun altro finisca qui con il mio problema con una configurazione di DB First Entity Framework.

Per farla breve, ho dovuto sovraccaricare il costruttore Entities per accettare una stringa di connessione, il motivo era la capacità di usare il contenitore di iniezione di dipendenza Asp.Net Core che estraeva la stringa di connessione da appsettings.json, piuttosto che ottenerla magicamente da App.config file quando si chiama il costruttore senza parametri.

Ho dimenticato di aggiungere le chiamate per inizializzare i miei DbSet nel nuovo sovraccarico. Quindi il costruttore senza parametri generato automaticamente assomigliava a questo:

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

E il mio nuovo sovraccarico sembrava così:

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

La soluzione era quella di aggiungere quegli inizializzatori di cui si occupa il codice generato automaticamente, un semplice passo mancato:

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

Questo mi ha davvero colpito per un ciclo perché alcune chiamate nel nostro repository che utilizzavano DbContext funzionavano bene (quelle che non avevano bisogno di quei DBS inizializzati) e le altre generavano l'errore di runtime descritto nell'OP.


1

Assicurati di iniettare il repository nel costruttore del servizio. Questo mi ha risolto. :: colpisce la fronte ::


1

Questa eccezione verrà restituita se si tenta di contare i valori in una raccolta null.

Ad esempio, quanto segue funziona quando Errori non è nullo, tuttavia se Errori è nullo, il Valore non può essere nullo. Nome parametro: si verifica un'eccezione di origine .

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

Questa eccezione può essere evitata controllando invece null.

if (graphQLResponse.Errors != null)

1

Risolto con la seguente soluzione

  1. Fare clic con il tasto destro sul edmxfile, selezionare Apri con, editor XML
  2. Individua l'entità edmx:StorageModelsnell'elemento
  3. Rimuovi del DefiningQuerytutto
  4. Rinomina store:Schema="dbo"in Schema="dbo"(se esiste)
  5. Rimuovi la store:Nameproprietà

Schema = "dbo" in Schema = "dbo" - cosa?
Vincent Buscarello,

0

Potrebbe essere sciocco come nel mio caso in cui i savechanges stavano sbagliando perché il db non aveva chiavi esterne e le associazioni venivano aggiunte alle tabelle EDM. Ho aggiunto chiavi esterne nel db e rigenerato EDM per una correzione.

Gli errori che ho riscontrato sono i seguenti: Caso 1 -> quando si utilizza DBContext per EDM Messaggio = Il valore non può essere nullo. Nome parametro: source su System.Linq.Enumerable.Any [TSource] ( 1 source, Funcpredicato IEnumerable 2)

Caso 2 -> quando si utilizza ObjectContext per EDM Message = Impossibile aggiornare il "contatto" di EntitySet perché ha un oggetto DefiningQuery e non esiste alcun elemento nell'elemento per supportare l'operazione corrente.

(Volevo solo buttarlo lì nel caso in cui aiuti qualcuno).


0

In MVC, la schermata Visualizza chiama il metodo che si trova in Controller o Repository.cs e assegna il valore restituito a qualsiasi controllo in CSHTML ma quel metodo non è effettivamente implementato in .cs / controller, quindi CSHTML genererà l'eccezione del parametro NULL


0

Ho ricevuto questo errore quando avevo un tipo non valido per una proprietà di entità.

public Type ObjectType {get;set;}

Quando ho rimosso la proprietà, l'errore si è verificato.


0

Nel mio caso, il problema è emerso durante la configurazione dell'applicazione Web su IIS, quando è stato generato il comando di aggiornamento su qualsiasi record, questo errore è stato generato.

Si è verificato un problema di autorizzazione su App_Data impostato su sola lettura. Fare clic con il tasto destro del mouse sulla cartella, deselezionare la casella di controllo Sola lettura e il gioco è fatto. A proposito, a scopo di test, stavo usando il database localdb che si trovava nella cartella App_Data.


0

Il mio errore era dimenticare di aggiungere .ThenInclude (s => s.SubChildEntities) al genitore. Includi (c => c.SubChildEntities) all'azione Controller quando si tenta di chiamare SubChildEntities nella vista Rasoio.

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

Va notato che IntelliSense della community di Visual Studio 2017 non rileva l'oggetto SubChildEntities nell'espressione lambda in .ThenInclude (). Tuttavia, compila ed esegue correttamente.


0

So che questa è una lunga strada dall'anno 2013 della domanda, ma questo sintomo può apparire se non hai il caricamento pigro abilitato durante la migrazione di un'app ASP.NET 5 su ASP.NET Core e quindi cercando di eseguire l'aggiornamento a Entity Framework Core 2.x (da EF 6). Entity Framework Core ha spostato il supporto proxy di caricamento lento in un pacchetto separato , quindi è necessario installarlo.

Ciò è particolarmente vero se tutto ciò che è stato caricato è un pacchetto Server SQL Core Entity Framework (che attiva Entity Framework bene).

Dopo aver installato il pacchetto proxy, quindi, come dicono i documenti, invocare .UseLazyLoadingProxies()il generatore di opzioni DbContext (nella sezione di installazione DI di avvio o ovunque si configuri DbContext) e la proprietà di navigazione che generava l'eccezione sopra smetterà di lanciarlo, e funzionerà come prima Entity Framework 6.


Ho iniziato su questa strada e in alcuni scenari potrebbe funzionare, ma mi sono imbattuto in questo abbastanza rapidamente stackoverflow.com/questions/41881169/...
infocyde

0

Ho avuto lo stesso problema con XUnit. Il problema era con la mia connessione al database. Verifica che la stringa di connessione sia corretta o meno.


0

E, nel mio caso, definisco erroneamente le mie due diverse colonne come identità su configurazioni DbContext come sotto,

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

Quando lo correggo come di seguito,

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

Mi sono anche sbarazzato di questo errore.


-3

Prendi una riga nel database e annulla tutta la colonna in quella riga come questa "NULL". Adesso passa quel valore NULL usando try catch o if else.


questa è un'idea terribile
Jason Loki Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.