Der Wert kann nicht Null sein. Parametername: Quelle

129

Dies ist wahrscheinlich die größte Zeitverschwendung, die ich seit langem stundenlang gelöst habe.

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

Dies gibt mir einen Fehler von

Der Wert kann nicht Null sein. Parametername: Quelle

Stapelspur von

[ArgumentNullException: Wert kann nicht null sein. Parametername: Quelle] System.Linq.Enumerable.Any ( 1 source, FuncPrädikat 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 ... ...

Ich möchte der Tabelle nur eine Entität hinzufügen. Das ORM ist EF.

Danielovich
quelle
7
Ist die Ausnahmemeldung nicht erklärend? Etwas ist null, das nicht null sein kann. Was ist Ihr Datenbankschema?
Ash Burlaczenko
Vielleicht möchten Sie diese Frage und ihre Antworten untersuchen: stackoverflow.com/questions/3244336/…
Ville Salonen
1
Wahrscheinlich hat einer der Einträge in collectin einen Nullwert: est.price = collection ["price"]; est.size = collection ["size"];
MikeTWebb
1
@ AshBurlaczenko oh, denkst du? Mein Schema sieht so aus, als ob jede Spalte null sein kann.
Danielovich
2
Könnten Sie Ihre Verbindungszeichenfolge posten?
Anaximander

Antworten:

42

Ich hatte diese vor einiger Zeit und die Antwort ist nicht unbedingt das, was Sie erwarten würden. Diese Fehlermeldung wird häufig angezeigt, wenn Ihre Verbindungszeichenfolge falsch ist.

Vermutlich brauchen Sie so etwas:

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

Was passiert ist, dass es nach einer Datenquelle am falschen Ort sucht; Entity Framework gibt es etwas anders an. Wenn Sie Ihre Verbindungszeichenfolge und EF-Konfiguration veröffentlichen, können wir dies überprüfen.

Anaximander
quelle
2
In meinem Fall war es eine falsche Verbindungszeichenfolge im Code, aber dennoch ein Problem mit der Verbindungszeichenfolge.
Jleach
190

Irgendwo innerhalb der DbContext ein Wert ist , ist IEnumerableund ist mit abgefragt Any()(oder Where()oder Select()oder einem beliebigen anderem LINQ-Verfahren), aber dieser Wert ist null.

Finden Sie heraus, ob Sie eine Abfrage (irgendwo außerhalb Ihres Beispielcodes) zusammengestellt haben, in der Sie eine LINQ-Methode verwenden, oder ob Sie eine IEnumerableals Parameter verwendet haben, die NULL ist.

Martin Mulder
quelle
7
Dies hat das Problem für mich gelöst. Ich vermute, dass dies auch die Lösung für das OP ist, obwohl die akzeptierte Antwort anders ist.
NibblyPig
4
Die Antwort für mich war, dass ich die Liste, mit der ich filtern wollte, noch nicht initialisiert hatte .Where()- es war immer noch null.
Brian Lacy
1
Um diese Art von Nullfehlern zu vermeiden, sollten Sie entweder versuchen, einen Standardwert in die IEnumerable-Eigenschaften einzufügen, oder sie mit Any ()
Fer R
1
Wie ist diese Antwort mit mehr als 140 Upvotes unter den anderen Antworten mit viel niedrigerer Bewertung?
nldev
1
Diese Antwort ist niedriger, da sie nicht akzeptiert wird. Die erste Antwort war möglicherweise die richtige Antwort für das Originalplakat. Diese Antwort war möglicherweise die richtige Antwort für viele andere Menschen.
Martin Mulder
11

Mein Grund war anders als der Rest hier, also dachte ich, ich würde es für alle anderen posten, die dieses Problem haben könnten.

Ich habe Count für eine Instanz von DbSet mit einem Filter von null aufgerufen, d. H.

dbSet.Count(null);

Ich habe festgestellt, dass das Übergeben von null hier den Fehler verursacht hat. Daher rufe ich jetzt die parameterlose Methode auf, wenn der Filter null ist:

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

Dies hat das Problem für mich gelöst. Dies kann auch für andere Methoden in DbSet ein Problem sein.

Guy Lowe
quelle
9

Ich habe genau diesen Fehler in .Net - Core 2.2 Entity Framework , weil ich nicht das habe set;in meinem DbContextetwa so:

public DbSet<Account> Account { get; }

gewechselt zu:

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

Die Ausnahme wurde jedoch erst angezeigt, als ich versuchte, eine Linq-Abfrage mit Where()und Select()wie bereits erwähnt zu verwenden.

Ich habe versucht, das DbSetals schreibgeschützt einzustellen . Ich werde es weiter versuchen ...

Summe keine
quelle
1
Ich hatte gerade genau dieses Problem, als ich versuchte, meine Assembly mit Linqpad zu verwenden. Danke dafür, ich hätte viel mehr Zeit verschwenden können. .Net Core 3.1 / EF Core 3.1 hier.
Sonntag,
3

Nur als FYI kann es jemand nützlich finden. Ich habe fast 2 Tage lang meinen Schwanz nach diesem Fehler gejagt und immer etwas Großes gedacht und nach den Klassen gesucht, die das Problem sein könnten. Schließlich fand ich es sehr dumm und es war in meinem Markup (HTML) -Code in mypage.ascx . Das Problem war, dass ich eine habe <asp:EntityDataSource>und diese eine include-Eigenschaft hat und ich einige andere Tabellen hier aufgelistet habe und fälschlicherweise eine Tabelle vorhanden war, die kürzlich aus der Datenbank gelöscht wurde und die ich nie bemerkt habe und die bei anderen Entitäten null zurückgibt. Ich habe gerade die blöde Tabelle aus der Include-Liste entfernt und kann loslegen. hoffe, das kann jemandem helfen.

Johnny
quelle
2

Für den Fall, dass jemand anderes hier mit meinem Problem mit einem DB First Entity Framework-Setup endet.

Kurz gesagt, ich musste den Entities-Konstruktor überladen, um eine Verbindungszeichenfolge zu akzeptieren. Der Grund dafür war die Möglichkeit, den Asp.Net Core-Abhängigkeitsinjektionscontainer zu verwenden, der die Verbindungszeichenfolge aus appsettings.json abruft, anstatt sie auf magische Weise aus der App.config abzurufen Datei beim Aufruf des parameterlosen Konstruktors.

Ich habe vergessen, die Aufrufe hinzuzufügen, um meine DbSets in der neuen Überladung zu initialisieren. Der automatisch generierte parameterlose Konstruktor sah also ungefähr so ​​aus:

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

Und meine neue Überlastung sah so aus:

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

Die Lösung bestand darin, die Initialisierer hinzuzufügen, für die der automatisch generierte Code sorgt, ein einfacher, fehlgeschlagener Schritt:

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

Dies warf mich wirklich in eine Schleife, da einige Aufrufe in unserem Respository, die den DbContext verwendeten, gut funktionierten (diejenigen, die diese initialisierten DBSets nicht benötigten), und die anderen den im OP beschriebenen Laufzeitfehler auslösen.

Franklin Tarter
quelle
1

Stellen Sie sicher, dass Sie das Repository in den Konstruktor des Dienstes einfügen. Das hat es für mich gelöst. :: schlägt auf die Stirn ::

KennethDale1
quelle
1

Diese Ausnahme wird zurückgegeben, wenn Sie versuchen, Werte in einer Nullsammlung zu zählen.

Das Folgende funktioniert beispielsweise, wenn Errors nicht null ist. Wenn Errors jedoch null ist, kann der Wert nicht null sein. Parametername: Quellausnahme tritt auf.

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

Diese Ausnahme kann vermieden werden, indem stattdessen auf null geprüft wird.

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

Mit der folgenden Lösung gelöst

  1. Klicken Sie mit der rechten Maustaste auf die edmxDatei und wählen Sie Öffnen mit, XML-Editor
  2. Suchen Sie die Entität im edmx:StorageModelsElement
  3. Entfernen Sie die DefiningQueryvollständig
  4. Benennen Sie das store:Schema="dbo"in um Schema="dbo"(falls vorhanden)
  5. Entfernen Sie die store:NameEigenschaft
Ahmedk
quelle
Schema = "dbo" bis Schema = "dbo" - was?
Vincent Buscarello
0

Es könnte so albern sein wie in meinem Fall, in dem Sicherungsänderungen fehlerhaft waren, weil die Datenbank keine Fremdschlüssel hatte und den EDM-Tabellen Zuordnungen hinzugefügt wurden. Ich habe Fremdschlüssel in die Datenbank eingefügt und EDM für eine Korrektur neu generiert.

Die Fehler, die ich gesehen habe, sind folgende: Fall 1 -> bei Verwendung von DBContext für EDM Message = Wert kann nicht null sein. Parametername: Quelle bei System.Linq.Enumerable.Any [TSource] ( 1 source, FuncPrädikat IEnumerable 2)

Fall 2 -> bei Verwendung von ObjectContext für EDM Message = Das EntitySet 'Contact' kann nicht aktualisiert werden, da es eine DefiningQuery enthält und kein Element im Element vorhanden ist, das den aktuellen Vorgang unterstützt.

(Ich wollte es nur da reinwerfen, falls es jemandem hilft).

Cunderpants
quelle
0

In MVC ruft der View-Bildschirm eine Methode auf, die sich in Controller oder Repository.cs befindet, und weist jedem Steuerelement in CSHTML einen Rückgabewert zu. Diese Methode ist jedoch in .cs / controller nicht implementiert. Dann löst CSHTML die NULL-Parameterausnahme aus

Muru Bakthavachalam
quelle
0

Ich habe diesen Fehler erhalten, als ich einen ungültigen Typ für eine Entitätseigenschaft hatte.

public Type ObjectType {get;set;}

Als ich die Eigenschaft entfernte, trat der Fehler nicht mehr auf.

Kirsten Gier
quelle
0

In meinem Fall trat das Problem beim Konfigurieren der Webanwendung unter IIS auf. Als der Aktualisierungsbefehl für einen Datensatz ausgelöst wurde, wurde dieser Fehler generiert.

Es war ein Berechtigungsproblem für App_Data, das schreibgeschützt war. Klicken Sie mit der rechten Maustaste auf den Ordner, deaktivieren Sie das Kontrollkästchen Schreibgeschützt und Sie sind fertig. Übrigens habe ich zu Testzwecken die localdb-Datenbank verwendet, die sich im Ordner App_Data befand.

Sunil Jatolia
quelle
0

Mein Fehler bestand darin, zu vergessen, die .ThenInclude (s => s.SubChildEntities) zum übergeordneten .Include (c => c.SubChildEntities) zur Controller-Aktion hinzuzufügen, wenn versucht wurde, die SubChildEntities in der Razor-Ansicht aufzurufen.

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

Es ist zu beachten, dass IntelliSense von Visual Studio 2017 Community das SubChildEntities-Objekt im Lambda-Ausdruck in .ThenInclude () nicht aufnimmt. Es wird jedoch erfolgreich kompiliert und ausgeführt.

Jared G.
quelle
0

Ich weiß, dass dies ein langer Weg vom Jahr 2013 der Frage ist, aber dieses Symptom kann auftreten, wenn Sie das verzögerte Laden nicht aktiviert haben, wenn Sie eine ASP.NET 5-App auf ASP.NET Core migrieren und dann versuchen, ein Upgrade auf durchzuführen Entity Framework Core 2.x (ab EF 6). Entity Framework Core hat die Unterstützung für das verzögerte Laden von Proxys in ein separates Paket verschoben , sodass Sie es installieren müssen.

Dies gilt insbesondere dann, wenn Sie nur ein Entity Framework Core SQL Server-Paket geladen haben (das Entity Framework einwandfrei aktiviert).

.UseLazyLoadingProxies()Rufen Sie nach der Installation des Proxy-Pakets, wie in den Dokumenten angegeben, den Builder für DbContext-Optionen auf (in Ihrem Startup DI-Setup-Abschnitt oder überall dort, wo Sie Ihren DbContext konfigurieren), und die Navigationseigenschaft, die die obige Ausnahme ausgelöst hat, wird nicht mehr ausgelöst. und wird wie früher Entity Framework 6 funktionieren.

Michael Rivera
quelle
Ich habe diesen Weg eingeschlagen und in einigen Szenarien könnte es funktionieren, aber ich bin ziemlich schnell auf diesen Infode
gestoßen.
0

Ich hatte das gleiche Problem mit XUnit. Das Problem war mit meiner Datenbankverbindung. Überprüfen Sie, ob Ihre Verbindungszeichenfolge korrekt ist oder nicht.

Chamila Maddumage
quelle
0

Und in meinem Fall definiere ich meine zwei verschiedenen Spalten fälschlicherweise als Identitäten in DbContext-Konfigurationen wie unten.

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

Wenn ich es wie unten korrigiere,

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

Ich habe diesen Fehler auch beseitigt.

RaZzLe
quelle
-3

Nehmen Sie eine Zeile in die Datenbank und machen Sie die gesamte Spalte in dieser Zeile wie folgt "NULL". Übergeben Sie jetzt diesen NULL-Wert mit try catch oder if else.

Jarin Farhad
quelle
Dies ist eine schreckliche Idee
Jason Loki Smith