Dies ist wahrscheinlich das größte Zeitverschwendungsproblem, das ich seit langer Zeit 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();
Das gibt mir einen Fehler von
Der Wert kann nicht Null sein. Parametername: Quelle
stacktrace von
[ArgumentNullException: Wert darf nicht null sein. Parametername: Quelle] System.Linq.Enumerable.Any (IEnumerable
1 source, Func
2 Prädikat) +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. Der ORM ist EF.
Ich hatte dies vor einer Weile, und die Antwort ist nicht unbedingt das, was Sie erwarten würden. Diese Fehlermeldung wird häufig angezeigt, wenn Ihre Verbindungszeichenfolge falsch ist.
Vermutlich benötigen Sie Folgendes:
<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 nach einer Datenquelle am falschen Ort gesucht wird. Entity Framework gibt es etwas anders an. Wenn Sie Ihre Verbindungszeichenfolge und EF-Konfiguration posten, können wir dies überprüfen.
Irgendwo im DbContext befindet sich ein Wert, der IEnumerable
ist und mit Any()
(oder Where()
oder Select()
oder einer anderen LINQ-Methode abgefragt wird.) , aber dieser Wert ist null
.
Finden Sie heraus, ob Sie eine Abfrage zusammenstellen (irgendwo außerhalb Ihres Beispielcodes), bei der Sie eine LINQ-Methode verwenden, oder ob Sie IEnumerable
als Parameter verwendet haben, der NULL ist.
Mein Grund war anders als der Rest hier, also dachte ich, ich würde es für jeden anderen posten, der dieses Problem haben könnte.
Ich habe Count für eine Instanz von DbSet mit einem Filter von null aufgerufen, d. H.
dbSet.Count(null);
Ich fand heraus, dass das Übergeben von null hier den Fehler verursachte. 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 ein Problem für andere Methoden in DbSet sein.
gerade als eine FYI kann jemand es nützlich finden. Ich habe meinen Schwanz für diesen Fehler fast 2 Tage lang gejagt und mir immer etwas Großes überlegt und nach den Klassen gesucht, die das Problem sein könnten, und schließlich fand ich es sehr dumm und es war in meinem Markup-Code (HTML) in mypage.ascx . das Problem war, ich habe ein <asp:EntityDataSource>
und dies hat eine include-Eigenschaft und ich habe einige andere Tabellen hier aufgelistet und fälschlicherweise war eine Tabelle da, die kürzlich aus der Datenbank gelöscht wurde, und ich habe nie bemerkt, dass sie bei anderen Entitäten null zurückgibt. Ich habe gerade die dumme Tabelle aus der Include-Liste entfernt und es kann losgehen. hoffe das kann jemandem helfen.
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, dass der Asp.Net Core-Container für die Abhängigkeitsinjektion die Verbindungszeichenfolge aus appsettings.json ziehen konnte, anstatt sie magisch 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 Konstruktor ohne Parameter sah also ungefähr so aus:
public MyEntities()
: base("name=MyEntity")
{
Set1 = Set<MyDbSet1>();
Set2 = Set<MyDbSet2>();
}
Und meine neue Überladung sah so aus:
public MyEntities(string connectionString)
: base(connectionString)
{
}
Die Lösung bestand darin, die Initialisierer hinzuzufügen, um die sich der automatisch generierte Code kümmert.
public MyEntities(string connectionString)
: base(connectionString)
{
Set1 = Set<MyDbSet1>();
Set2 = Set<MyDbSet2>();
}
Dies warf mich wirklich für eine Schleife, weil einige Aufrufe in unserem Respository, die den DbContext verwendeten, einwandfrei funktionierten (diejenigen, die diese initialisierten DBSets nicht benötigten), und die anderen den im OP beschriebenen Laufzeitfehler auslösten.
Mit folgender Lösung gelöst
Stellen Sie sicher, dass Sie das Repository in den Konstruktor des Dienstes einfügen. Das hat es für mich gelöst. :: schmatzt auf die Stirn ::
Nehmen Sie eine Zeile in die Datenbank und machen Sie alle Spalten in dieser Zeile zu Null, wie dies "NULL". Übergeben Sie diesen NULL-Wert jetzt mit try catch oder wenn sonst.
In MVC ruft der Bildschirm "Ansicht" eine Methode auf, die sich in "Controller" oder "Repository.cs" befindet, und weist einem Steuerelement in CSHTML einen Rückgabewert zu, diese Methode ist jedoch in ".cs/controller" nicht implementiert. In diesem Fall löst CSHTML die NULL-Parameterausnahme aus
Ich weiß, dass dies ein langer Weg vom Jahr 2013 der Frage ist, aber dieses Symptom kann auftreten, wenn beim Migrieren einer ASP.NET 5-App zu ASP.NET Core und anschließenden Aktualisieren auf nicht verzögertes Laden aktiviert ist 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 , daher müssen Sie es installieren.
Dies gilt insbesondere dann, wenn Sie lediglich ein Entity Framework Core SQL Server-Paket geladen haben (wodurch Entity Framework einwandfrei aktiviert wird).
Rufen Sie nach der Installation des Proxy-Pakets, wie in den Dokumenten angegeben, .UseLazyLoadingProxies()
im Builder für DbContext-Optionen (im Setup-Abschnitt von Startup DI oder wo immer Sie Ihren DbContext konfigurieren) und in der Navigationseigenschaft auf, die die ausgelöst hat Die obige Ausnahme beendet das Auslösen und funktioniert wie Entity Framework 6.
Mein Fehler war, dass ich vergessen habe, die .ThenInclude (s => s.SubChildEntities) der übergeordneten .Include (c => c.SubChildEntities) der Controller-Aktion hinzuzufügen, als ich versuchte, 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.
Es könnte so albern sein wie in meinem Fall, in dem Speicheränderungen fehlschlugen, da die Datenbank keine Fremdschlüssel hatte und Zuordnungen zu EDM-Tabellen hinzugefügt wurden. Ich habe Fremdschlüssel in die Datenbank eingefügt und EDM für einen Fix neu generiert.
Die Fehler, die ich gesehen habe, sind wie folgt: Fall 1 -> bei Verwendung von DBContext für EDM-Nachricht = Wert kann nicht null sein. Parametername: Quelle bei System.Linq.Enumerable.Any [TSource] (IEnumerable1 source, Func
2 Prädikat)
Fall 2 -> bei Verwendung von ObjectContext für EDM Message = 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.
(Wollte es nur dort reinwerfen, falls es jemandem hilft).
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, hörte der Fehler auf aufzutreten.
In meinem Fall trat das Problem beim Konfigurieren der Webanwendung auf 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 auf schreibgeschützt gesetzt war. Klicken Sie mit der rechten Maustaste auf den Ordner, deaktivieren Sie das Kontrollkästchen Schreibgeschützt, und fertig. Übrigens habe ich zu Testzwecken die localdb-Datenbank verwendet, die sich im Ordner App_Data befand.
Ich habe gerade genau diesen Fehler in .NET Core 2.2 Entity Framework erhalten, weil ich in meinem DbContext
nicht den folgenden set;
Hatte:
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()
zu verwenden, wie andere oben erwähnt hatten.
Ich habe versucht, DbSet
als schreibgeschützt festzulegen. Ich werde es weiter versuchen ...