Wartość nie może być pusta. Nazwa parametru: źródło

129

Jest to prawdopodobnie największy problem ze stratą czasu, nad rozwiązaniem którego spędziłem godziny.

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

To daje mi błąd

Wartość nie może być pusta. Nazwa parametru: źródło

stacktrace of

[ArgumentNullException: Value nie może być null. Nazwa parametru: źródło] System.Linq.Enumerable.Any ( 1 source, Funcpredykat 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 ... ...

Chcę tylko dodać jednostkę do tabeli. ORM to EF.

danielovich
źródło
7
Czy komunikat o wyjątku nie jest wyjaśniający? Coś jest zerowe, co nie może być zerowe. Jaki jest Twój schemat db?
Ash Burlaczenko
Możesz spojrzeć na to pytanie i odpowiedzi na nie: stackoverflow.com/questions/3244336/…
Ville Salonen
1
Prawdopodobnie jeden z wpisów w collectin ma wartość null: est.price = collection ["price"]; est.size = kolekcja ["rozmiar"];
MikeTWebb
1
@AshBurlaczenko oh myślisz? Mój schemat wygląda na to, że każda kolumna może mieć wartość NULL.
danielovich
2
Czy możesz opublikować swoje parametry połączenia?
anaximander

Odpowiedzi:

42

Miałem to jakiś czas temu i odpowiedź niekoniecznie jest taka, jakiej można się spodziewać. Ten komunikat o błędzie często pojawia się, gdy parametry połączenia są nieprawidłowe.

Przypuszczalnie będziesz potrzebować czegoś takiego:

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

Dzieje się tak, że szuka źródła danych w niewłaściwym miejscu; Entity Framework określa to nieco inaczej. Jeśli opublikujesz parametry połączenia i konfigurację EF, możemy to sprawdzić.

anaksymander
źródło
2
W moim przypadku był to niepoprawny ciąg połączenia w kodzie, ale mimo to problem z ciągiem połączenia.
jleach
190

Gdzieś wewnątrz DbContext znajduje się wartość, która jest IEnumerablei jest wykonywana przy użyciu Any()(lub Where()lub Select()lub dowolnej innej metody LINQ), ale ta wartość to null.

Dowiedz się, czy umieściłeś zapytanie razem (gdzieś poza przykładowym kodem), w którym używasz metody LINQ, lub że IEnumerablejako parametr został użyty parametr o wartości NULL.

Martin Mulder
źródło
7
To rozwiązało problem dla mnie, podejrzewam, że jest to również rozwiązanie dla PO, mimo że przyjęta odpowiedź jest inna.
NibblyPig
4
Odpowiedź dla mnie była taka, że ​​nie zainicjowałem jeszcze listy, na podstawie której próbowałem filtrować .Where()- nadal była null.
Brian Lacy
1
Aby uniknąć tego rodzaju błędów zerowych, należy spróbować umieścić wartość domyślną we właściwościach IEnumerable lub przetestować je za pomocą Any ()
Fer R
1
Jak wygląda ta odpowiedź z ponad 140 głosami pozytywnymi pod innymi, znacznie niżej ocenionymi odpowiedziami?
nldev
1
Ta odpowiedź jest niższa, ponieważ nie jest to akceptowana odpowiedź. Pierwsza odpowiedź była prawdopodobnie poprawną odpowiedzią dla oryginalnego plakatu. Ta odpowiedź była prawdopodobnie właściwą odpowiedzią dla wielu innych ludzi.
Martin Mulder
11

Mój powód był inny niż reszta tutaj, więc pomyślałem, że opublikuję go dla każdego, kto może mieć ten problem.

Wywołałem Count na wystąpieniu DbSet z filtrem o wartości null ie

dbSet.Count(null);

Zauważyłem, że przekazanie tutaj wartości null powodowało błąd, więc teraz wywołuję metodę bez parametrów, jeśli filtr ma wartość null:

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

To rozwiązało problem. Może to stanowić problem również w przypadku innych metod w DbSet.

Guy Lowe
źródło
9

Właśnie otrzymałem ten dokładny błąd w .Net Core 2.2 Entity Framework, ponieważ nie miałem set;w moim DbContext:

public DbSet<Account> Account { get; }

zmienić na:

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

Jednak nie pokazywał wyjątku, dopóki nie spróbowałem użyć zapytania linq z Where()i Select()jak wspominali inni powyżej.

Próbowałem ustawić DbSetjako tylko do odczytu. Będę próbował ...

Suma Brak
źródło
1
Właśnie miałem ten problem podczas próby użycia mojego zestawu z Linqpadem. Dzięki za to mogłem zmarnować znacznie więcej czasu. .NET Core 3.1 / EF Core 3.1 tutaj.
niedziela
3

tak jak do Twojej wiadomości, ktoś może uznać to za przydatne. Ścigałem swój ogon za ten błąd prawie 2 dni i zawsze myślałem o czymś dużym i szukałem klas, które mogą być problemem, aż w końcu znalazłem to bardzo głupi problem i było to w moim kodzie znacznika (HTML) w mypage.ascx . problem polegał na tym, że mam <asp:EntityDataSource>a to ma właściwość include i mam kilka innych tabel wymienionych tutaj i omyłkowo była tam tabela, która została niedawno usunięta z bazy danych i nigdy nie zauważyłem i zwraca wartość null z innymi jednostkami. Właśnie usunąłem głupią tabelę z listy włączeń i mogę już iść. mam nadzieję, że to komuś pomoże.

Jasio
źródło
2

Na wypadek, gdyby ktoś inny skończył tutaj z moim problemem z konfiguracją DB First Entity Framework.

Krótko mówiąc, musiałem przeciążać konstruktor Entities, aby zaakceptować parametry połączenia, ponieważ powodem jest możliwość użycia kontenera iniekcji zależności Asp.Net Core, który pobiera parametry połączenia z appsettings.json, zamiast magicznie pobierać je z App.config file podczas wywoływania konstruktora bez parametrów.

Zapomniałem dodać wywołania do zainicjowania moich DbSets w nowym przeciążeniu. Więc automatycznie generowany konstruktor bez parametrów wyglądał mniej więcej tak:

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

A moje nowe przeciążenie wyglądało tak:

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

Rozwiązaniem było dodanie tych inicjatorów, o które dba automatycznie generowany kod, prosty pominięty krok:

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

To naprawdę rzuciło mnie na pętlę, ponieważ niektóre wywołania w naszym repozytorium, które korzystały z kontekstu DbContext, działały dobrze (te, które nie potrzebowały tych zainicjowanych zestawów DBS), a inne zgłaszały błąd czasu wykonania opisany w OP.

Franklin Tarter
źródło
1

Upewnij się, że wstrzykujesz repozytorium do konstruktora usługi. To mi rozwiązało problem. :: bije w czoło ::

KennethDale1
źródło
1

Ten wyjątek zostanie zwrócony, jeśli spróbujesz zliczyć wartości w kolekcji zerowej.

Na przykład poniższe działa, gdy błędy nie mają wartości null, jednak jeśli błędy mają wartość null, wartość nie może mieć wartości null. Nazwa parametru: występuje wyjątek źródłowy .

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

Tego wyjątku można uniknąć, sprawdzając zamiast tego wartość null.

if (graphQLResponse.Errors != null)
Daniel de Zwaan
źródło
1

Rozwiązano za pomocą następującego rozwiązania

  1. Kliknij edmxplik prawym przyciskiem myszy , wybierz Otwórz za pomocą, edytor XML
  2. Zlokalizuj jednostkę w edmx:StorageModelselemencie
  3. Usuń DefiningQuerycałkowicie
  4. Zmienić nazwę store:Schema="dbo"się Schema="dbo"(jeśli istnieje)
  5. Usuń store:Namewłaściwość
Ahmedk
źródło
Schemat = "dbo" do Schemat = "dbo" - co?
Vincent Buscarello
0

Mogło być tak głupio, jak w moim przypadku, gdy savechanges zawierał błąd bcoz baza danych nie miała obcych kluczy i do tabel EDM zostały dodane skojarzenia. Dodałem klucze obce do bazy danych i zregenerowałem EDM dla poprawki.

Błędy, które widziałem, są następujące: Przypadek 1 -> podczas używania DBContext dla EDM Message = Wartość nie może być zerowa. Nazwa parametru: source at System.Linq.Enumerable.Any [TSource] ( 1 source, Funcpredykat IEnumerable 2)

Przypadek 2 -> podczas korzystania z ObjectContext dla EDM Message = Nie można zaktualizować EntitySet „Contact”, ponieważ ma on DefiningQuery i nie ma elementu w elemencie obsługującym bieżącą operację.

(Chciałem tylko wrzucić to tam na wypadek, gdyby to komuś pomogło).

cunderpants
źródło
0

W MVC, View screen wywołuje metodę znajdującą się w Controller lub Repository.cs i przypisuje wartość zwracaną do dowolnej kontrolki w CSHTML, ale ta metoda nie jest faktycznie zaimplementowana w .cs / controller, wtedy CSHTML wyrzuci wyjątek parametru NULL

Muru Bakthavachalam
źródło
0

Otrzymałem ten błąd, gdy miałem nieprawidłowy typ dla właściwości jednostki.

public Type ObjectType {get;set;}

Kiedy usunąłem nieruchomość, błąd przestał występować.

Kirsten Greed
źródło
0

W moim przypadku problem wyskoczył podczas konfigurowania aplikacji internetowej na IIS, gdy uruchomiono polecenie update na dowolnym rekordzie ten błąd został wygenerowany.

Był to problem z uprawnieniami w App_Data, który został ustawiony jako tylko do odczytu. Kliknij folder prawym przyciskiem myszy, usuń zaznaczenie pola wyboru Tylko do odczytu i gotowe. Nawiasem mówiąc, do celów testowych korzystałem z bazy danych localdb znajdującej się w folderze App_Data.

Sunil Jatolia
źródło
0

Mój błąd polegał na tym, że zapomniałem dodać .ThenInclude (s => s.SubChildEntities) do elementu nadrzędnego .Include (c => c.SubChildEntities) do akcji kontrolera podczas próby wywołania SubChildEntities w widoku Razor.

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

Należy zauważyć, że technologia IntelliSense społeczności programu Visual Studio 2017 nie pobiera obiektu SubChildEntities w wyrażeniu lambda w .ThenInclude (). Jednak z powodzeniem kompiluje się i wykonuje.

Jared G.
źródło
0

Wiem, że to długa droga od roku 2013 pytania, ale ten symptom może się pojawić, jeśli nie masz włączonego leniwego ładowania podczas migracji aplikacji ASP.NET 5 do ASP.NET Core, a następnie próbujesz uaktualnić do Entity Framework Core 2.x (z EF 6). Entity Framework Core przeniósł obsługę serwera proxy z opóźnionym ładowaniem do oddzielnego pakietu , więc musisz go zainstalować.

Jest to szczególnie ważne, jeśli wszystko, co załadowałeś, to pakiet Entity Framework Core Sql Server (który włącza Entity Framework dobrze).

Po zainstalowaniu pakietu proxy, jak mówią dokumenty, .UseLazyLoadingProxies()wywołaj w konstruktorze opcji DbContext (w sekcji konfiguracji Startup DI lub gdziekolwiek skonfigurujesz swój DbContext), a właściwość nawigacyjna, która rzucała powyższy wyjątek, przestanie go zgłaszać, i będzie działać jak wcześniej Entity Framework 6.

Michael Rivera
źródło
Zacząłem tą ścieżką iw niektórych scenariuszach może to zadziałać, ale natknąłem się na ten stackoverflow.com/questions/41881169/ ...
infocyde
0

Miałem ten sam problem z XUnit. Problem dotyczył mojego połączenia z bazą danych. Sprawdź, czy parametry połączenia są poprawne, czy nie.

Chamila Maddumage
źródło
0

W moim przypadku omyłkowo definiuję moje dwie różne kolumny jako tożsamości w konfiguracjach DbContext, jak poniżej,

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

Kiedy poprawię to jak poniżej,

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

Pozbyłem się również tego błędu.

RaZzLe
źródło
-3

Weź wiersz w bazie danych i ustaw wszystkie kolumny w tym wierszu na wartość zerową, taką jak „NULL”. Teraz przekaż tę wartość NULL za pomocą try catch lub if else.

Jarin Farhad
źródło
to jest okropny pomysł
Jason Loki Smith