Значення не може бути нульовим. Назва параметра: джерело


129

Це, мабуть, найбільша проблема трати часу, на яку я витратив години на вирішення.

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

Це дає мені помилку

Значення не може бути нульовим. Назва параметра: джерело

стека

[ArgumentNullException: значення не може бути нульовим. Назва параметра: джерело] System.Linq.Enumerable.Any ( 1 source, Funcпредикат IEnumerable 2) +4083335 System.Data.Entity.Internal.InternalContext.WrapUpdateException (UpdateException updateException) +87
System.Data.Entity.Internal.InternalChanges 193
System.Data.Entity.Internal.LazyInternalContext.SaveChanges () +33
System.Data.Entity.DbContext.SaveChanges () +20 ... ...

Я просто хочу додати сутність до таблиці. ОРМ - EF.


7
Чи не повідомлення про виключення пояснювальне? Щось недійсне, що не може бути нульовим. Яка ваша схема db?
Еш Бурлаценко

Ви можете поглянути на це питання та його відповіді: stackoverflow.com/questions/3244336/…
Віль Салонен

1
Можливо, одна із записів у collein має нульове значення: est.price = collection ["ціна"]; est.size = collection ["розмір"];
MikeTWebb

1
@AshBurlaczenko о, ти думаєш? Моя схема виглядає так, що кожен стовпець може бути нульовим.
danielovich

2
Чи можете ви розмістити рядок з'єднання?
anaximander

Відповіді:


42

У мене це було деякий час назад, і відповідь не обов’язково те, що ви очікували. Це повідомлення про помилку часто з’являється, коли рядок підключення неправильний.

Здогадуючись, вам знадобиться щось подібне:

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

Що відбувається, це те, що він шукає джерело даних у неправильному місці; Entity Framework визначає це дещо інакше. Якщо ви розмістите рядок з'єднання та конфігурацію EF, ми можемо перевірити.


2
У моєму випадку це був неправильний рядок з'єднання в коді, але все-таки проблема з рядком з'єднання.
jleach

190

Десь усередині DbContext є значення, яке є IEnumerableі запитується за допомогою Any()( Where()або Select()або будь-якого іншого методу LINQ), але це значення є null.

З’ясуйте, чи ви склали запит разом (десь поза кодом прикладу), де ви використовуєте метод LINQ, чи використовували ви IEnumerableяк параметр NULL.


7
Це вирішило для мене проблему, я підозрюю, що це також рішення ОП, навіть якщо прийнята відповідь відрізняється.
NibblyPig

4
Відповідь для мене полягала в тому, що я ще не ініціалізував Список, з яким намагався фільтрувати .Where()- він все ще був null.
Брайан Лейсі

1
Щоб уникнути подібних нульових помилок, вам слід спробувати поставити значення за замовчуванням у властивості IEnumerable або протестувати їх за допомогою Any ()
Fer R

1
Як ця відповідь на 140+ оновлень нижче інших набагато нижчих оцінок?
nldev

1
Ця відповідь нижча, оскільки це не прийнята відповідь. Перша відповідь, можливо, була правильною відповіддю для оригінального плаката. Ця відповідь, можливо, була правильною відповіддю для багатьох інших людей.
Мартін Малдер

11

Моя причина була іншою в порівнянні з рештою тут, тому я подумав, що опублікую її для всіх, хто може мати цю проблему.

Я дзвонив Count на екземпляр DbSet з фільтром нуля, тобто

dbSet.Count(null);

Я виявив, що передача нуля тут спричиняє помилку, тому тепер я викликаю метод без параметрів, якщо фільтр є нульовим:

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

Це сортувало питання для мене. Це може бути проблемою і для будь-яких інших методів на DbSet.


9

Я тільки що отримав цю точну помилку в .Net 2.2 Основний Entity Framework , тому що я не мав set;в моєму DbContextтак:

public DbSet<Account> Account { get; }

змінено на:

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

Однак він не показав винятку, поки я не спробував використати запит linq з Where()та, Select()як інші згадували вище.

Я намагався встановити значення " DbSetлише читання". Я буду намагатися ...


1
У мене була просто така проблема під час спроби використовувати мою збірку з Linqpad. Дякую за це, я міг би витратити більше часу. .Net Core 3.1 / EF Core 3.1 тут.
неділя

3

як FYI, хтось може вважати його корисним. Я переслідував свій хвіст за цю помилку майже 2 дні і завжди думав про щось велике і шукав класи, які могли б бути проблемою, і, нарешті, я вважав це дуже дурним питанням, і це було в моєму коді (HTML) коду в mypage.ascx . Проблема полягала в тому, що у мене є, <asp:EntityDataSource>і в цьому є властивість включати, і у мене є деякі інші таблиці, перераховані тут, і помилково була таблиця, яка була видалена з бази даних останнім часом, і я ніколи не помічав, і вона повертає нуль разом з іншими об'єктами. Я щойно видалив дурну таблицю зі списку включення, і мені добре йти. сподіваюся, що це може комусь допомогти.


2

У випадку, якщо хтось інший опиниться тут із моєю проблемою із налаштуванням системи DB First Entity Framework.

Коротше кажучи, мені потрібно було перевантажити конструктор Entities, щоб прийняти рядок з'єднання. Причиною стала можливість використання контейнера для введення залежності Asp.Net Core, який витягує рядок з'єднання з appsettings.json, а не магічно отримувати його з App.config файл при виклику конструктора без параметрів.

Я забув додати дзвінки, щоб ініціалізувати свої DbSets в новій перевантаженні. Тож створений без параметрів конструктор виглядав приблизно так:

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

І моя нова перевантаження виглядала так:

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

Рішення полягало в тому, щоб додати ті ініціалізатори, про які доглядає автоматично згенерований код, простий пропущений крок:

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

Це дійсно підштовхнуло мене до циклу, оскільки деякі дзвінки в нашому Репозиторії, які використовували DbContext, спрацювали нормально (ті, яким не потрібні ті ініціалізовані DBSets), а інші кидають помилку виконання, описану в ОП.


1

Переконайтеся, що ви вставляєте сховище в конструктор служби. Це вирішило це для мене. :: присмакує чолом ::


1

Цей виняток буде повернуто, якщо ви спробуєте підрахувати значення в нульовій колекції.

Наприклад, нижче працює, коли помилки не є нульовими, однак якщо помилки є нульовими, то значення не може бути нульовим. Назва параметра: відбувається виняток джерела .

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

Цього виключення можна уникнути, встановивши замість нуля.

if (graphQLResponse.Errors != null)

1

Вирішується наступним рішенням

  1. Клацніть правою кнопкою миші на edmxфайл, виберіть Відкрити за допомогою, редактор XML
  2. Знайдіть об'єкт у edmx:StorageModelsелементі
  3. Видаліть DefiningQueryцілком
  4. Перейменуйте store:Schema="dbo"на Schema="dbo"(якщо існує)
  5. Видаліть store:Nameвласність

Schema = "dbo" to Schema = "dbo" - що?
Вінсент Бускарелло

0

Це може бути настільки нерозумно, як і в моєму випадку, коли зміни змін помилялися, оскільки у db не було сторонніх ключів і асоціації були додані до таблиць EDM. Я додав сторонні ключі в db та відновлений EDM для виправлення.

Помилки, які я бачив, такі: Випадок 1 -> при використанні DBContext для EDM Message = Значення не може бути нульовим. Назва параметра: джерело в System.Linq.Enumerable.Any [TSource] (IEnumerable 1 source, Func2 предикат)

Випадок 2 -> при використанні ObjectContext для повідомлення EDM = Не вдається оновити EntitySet 'Contact', оскільки він має DefiningQuery і в елементі немає елемента, який би підтримував поточну операцію.

(Просто хотів закинути його туди, якщо він комусь допоможе).


0

У MVC, екран перегляду викликає метод виклику, який знаходиться в Controller або Repository.cs, і присвоює повернене значення будь-якому керуванню в CSHTML, але цей метод насправді не реалізований у .cs / контролері, тоді CSHTML викине виняток параметра NULL


0

Я отримав цю помилку, коли у мене був недійсний тип властивості суб'єкта.

public Type ObjectType {get;set;}

Коли я видалив властивість, помилка перестала виникати.


0

У моєму випадку проблема з'явилася під час налаштування веб-програми на IIS. Коли команда оновлення будь-якої записи була запущена, ця помилка генерується.

Це був дозвіл на App_Data, який встановлено лише для читання. Клацніть папку правою кнопкою миші, зніміть прапорець Лише для читання і закінчите. До речі, для тестування я використовував базу даних localdb, яка знаходилась у папці App_Data.


0

Моєю помилкою було забуття додати .ThenInclude (s => s.SubChildEntities) на батьківський .Include (c => c.SubChildEntities) до дії Controller при спробі викликати SubChildEntities у поданні Razor.

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

Слід зазначити, що IntelliSense спільноти Visual Studio 2017 не вибирає об’єкт SubChildEntities у виразі лямбда у .ThenInclude (). Однак він успішно компілює та виконує.


0

Я знаю, що це довгий шлях з 2013 року питання, але цей симптом може з’явитися, якщо у вас не активовано ледачу завантаження під час переміщення програми ASP.NET 5 на ASP.NET Core, а потім намагається оновити до Entity Framework Core 2.x (від EF 6). Entity Framework Core перемістив підтримку ледачого завантаження проксі в окремий пакет , тому вам доведеться встановити його.

Це особливо вірно, якщо все, що ви завантажили, це пакет сервера Entity Framework Core Sql Server (який просто вмикає Entity Framework).

Після встановлення пакета проксі-серверів, як кажуть документи, .UseLazyLoadingProxies()посилайтеся на конструктор параметрів DbContext (у розділі налаштування запуску DI, або де б ви не налаштували свій DbContext), а навігаційна властивість, яка кидала вищевказаний виняток, перестане кидати його, і буде працювати як Entity Framework 6 раніше.


Я пішов цим шляхом , і в деяких випадках це може працювати, але я зіткнувся з цим досить швидко stackoverflow.com/questions/41881169 / ...
infocyde

0

У мене була та сама проблема з XUnit. Проблема була в моєму підключенні до бази даних. Перевірте, чи правильно встановлено рядок підключення.


0

І, в моєму випадку, я помилково визначаю два різні колонки як ідентичності в конфігураціях DbContext, як показано нижче,

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

Коли я виправлю це як нижче,

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

Я також позбувся цієї помилки.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.