2013-04-29 16 views
71

Questo è probabilmente il più grande problema di spreco di tempo che ho trascorso ore a risolvere per un lungo periodo di tempo.Il valore non può essere nullo. Nome parametro: source

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

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

stacktrace di

[ArgumentNullException: Valore non può essere null. Nome del parametro: fonte] System.Linq.Enumerable.Any (IEnumerable 1 source, Func 2 predicato) 4.083.335 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? –

+0

Si potrebbe voler esaminare questa domanda e le sue risposte: http://stackoverflow.com/questions/3244336/using-linq-to-find-item-in-a-list-but-get-value-cannot-be -null-parameter-name –

+1

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

risposta

27

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

A occhio e croce, avrete bisogno di qualcosa di simile:

<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 è alla ricerca di una fonte di dati nel posto sbagliato; Entity Framework lo specifica in modo leggermente diverso. Se pubblichi la stringa di connessione e la configurazione EF, possiamo controllare.

+1

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

108

qualche parte all'interno della DbContext è un valore che è IEnumerable e viene interrogato con Any() (o Where() o Select() o qualsiasi altro metodo LINQ), ma questo valore è null.

Verificare se si inserisce una query (da qualche parte al di fuori del codice di esempio) in cui si utilizza un metodo LINQ o se è stato utilizzato uno IEnumerable come parametro NULL.

+4

Questo mi ha risolto il problema, sospetto che questa sia la soluzione all'OP anche se la risposta accettata è diversa. – NibblyPig

+3

La risposta per me era che non avevo ancora inizializzato la lista che stavo tentando di filtrare con '.Where()' - era ancora 'null'. –

+0

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

3

proprio come una FYI, qualcuno potrebbe trovarlo utile. Stavo inseguendo la mia coda per questo errore quasi 2 giorni e pensavo sempre a qualcosa di grosso e cercavo le classi che potevano essere il problema e alla fine l'ho trovato molto stupido ed era nel mio codice markup (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 cancellata dal database di recente e non l'ho mai notato e restituisce null con altre entità. Ho appena rimosso lo stupido tavolo dalla lista di inclusione e sono a posto. spero che questo possa aiutare qualcuno.

0

Potrebbe essere sciocco come nel mio caso in cui i savechanges stavano commettendo errori bcoz il db non aveva chiavi estranee e le associazioni venivano aggiunte alle tabelle EDM. Ho aggiunto chiavi esterne nel db e l'EDM rigenerato per una correzione.

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

Caso 2 -> quando si utilizza ObjectContext per EDM Messaggio = Impossibile aggiornare l'EntitySet 'Contatti', perché ha un DefiningQuery e nessun elemento esiste nell'elemento per supportare l'operazione corrente.

(Volevo solo lanciarlo lì nel caso in cui aiuta qualcuno).

0

In MVC, la schermata Visualizza sta chiamando il metodo che si trova in Controller o Repository.cs e assegna il valore di ritorno a qualsiasi controllo in CSHTML ma tale metodo non è in realtà implementato in .cs/controller, quindi CSHTML genererà l'eccezione del parametro NULL

8

La mia ragione era diversa dal resto qui, quindi ho pensato di pubblicarlo per chiunque altro potesse avere questo problema.

Ho chiamato conte in un'istanza di DbSet con un filtro di null cioè

dbSet.Count(null); 

ho scoperto che passando null qui stava causando l'errore così ora chiamo il metodo senza parametri se il filtro è nullo :

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.

1

risolto con la seguente soluzione

1) Fare clic destro sul file edmx, selezionare Apri con, editor XML

2) Individuare l'entità nel edmx: elemento StorageModels

3) Rimuovere la DefiningQuery interamente

4) Rinominare l'archivio: Schema = "dbo" allo schema = "dbo" (se esiste)

5) Rimuovere il deposito: Nome proprietà

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à si è verificato l'errore interrotto.

0

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

Si trattava di un problema di autorizzazione su App_Data impostato su Sola lettura. Fai clic con il pulsante destro del mouse sulla cartella, deseleziona 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.

Problemi correlati