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

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

Это дает мне ошибку

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

stacktrace из

[ArgumentNullException: значение не может быть нулевым. Имя параметра: источник] System.Linq.Enumerable.Any ( 1 source, Funcпредикат 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 ... ...

Я просто хочу добавить объект в таблицу. ORM - это EF.

Даниелович
источник
7
Разве сообщение об исключении не является пояснительным? Что-то является нулевым, что не может быть нулевым. Какая у вас схема БД?
Эш Бурлаченко
Возможно, вы захотите изучить этот вопрос и ответы на него: stackoverflow.com/questions/3244336/…
Вилле Салонен
1
Вероятно, одна из записей в collectin имеет нулевое значение: est.price = collection ["price"]; est.size = коллекция ["размер"];
MikeTWebb
1
@AshBurlaczenko о, ты думаешь? Моя схема выглядит так, будто каждый столбец может быть нулевым.
danielovich
2
Не могли бы вы опубликовать строку подключения?
анаксимандр

Ответы:

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
В моем случае это была неправильная строка conniption в коде, но, тем не менее, проблема со строкой подключения.
jleach
190

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

Выясните, составили ли вы запрос (где-то за пределами вашего примера кода), где вы используете LINQ-метод, или что вы использовали IEnumerableв качестве параметра значение NULL.

Мартин Малдер
источник
7
Это решило проблему для меня, я подозреваю, что это решение и для OP, хотя принятый ответ отличается.
NibblyPig
4
Ответом для меня было то, что я еще не инициализировал список, с помощью которого пытался фильтровать .Where()- он все еще был null.
Брайан Лейси
1
Чтобы избежать такого рода нулевых ошибок, вы должны либо попробовать
Fer R
1
Как этот ответ с более чем 140 положительными голосами ниже других ответов с гораздо более низким рейтингом?
nldev
1
Этот ответ ниже, потому что это не принятый ответ. Первый ответ, возможно, был правильным для оригинального плаката. Этот ответ, возможно, был правильным для многих других людей.
Мартин Малдер
11

Моя причина отличалась от остальных здесь, поэтому я решил опубликовать ее для всех, у кого может быть эта проблема.

Я вызывал Count на экземпляре DbSet с фильтром null, т.е.

dbSet.Count(null);

Я обнаружил, что передача значения null здесь вызывает ошибку, поэтому теперь я вызываю метод без параметров, если фильтр имеет значение 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

просто как к сведению, кому-то это может пригодиться. Я преследовал свой хвост за этой ошибкой почти 2 дня и всегда думал о чем-то большом и искал классы, которые могли бы быть проблемой, и, наконец, я обнаружил, что это очень глупая проблема, и это было в моем коде разметки (HTML) в mypage.ascx , проблема заключалась в том, что у <asp:EntityDataSource>меня есть свойство include, и у меня есть несколько других таблиц, перечисленных здесь, и по ошибке там была таблица, которая была недавно удалена из базы данных, и я никогда не замечал, и она возвращала null с другими объектами. Я только что удалил эту дурацкую таблицу из списка включений, и все готово. надеюсь, это может кому-то помочь.

Джонни
источник
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), а другие выдают ошибку времени выполнения, описанную в OP.

Франклин Тартер
источник
1

Убедитесь, что вы вводите репозиторий в конструктор службы. Это решило проблему для меня. :: шлепает лбом ::

KennethDale1
источник
1

Это исключение будет возвращено, если вы попытаетесь подсчитать значения в пустой коллекции.

Например, приведенное ниже работает, когда ошибки не равны нулю, однако, если ошибки равны нулю, значение не может быть нулевым. Имя параметра: возникает исключение источника .

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

Этого исключения можно избежать, вместо этого проверив значение null.

if (graphQLResponse.Errors != null)
Даниэль де Цваан
источник
1

Решено с помощью следующего решения

  1. Щелкните правой кнопкой мыши edmxфайл, выберите Открыть с помощью, редактор XML.
  2. Найдите объект в edmx:StorageModelsэлементе
  3. Удалите DefiningQueryполностью
  4. Переименование store:Schema="dbo"в Schema="dbo"(если есть)
  5. Снять store:Nameсобственность
Ahmedk
источник
Schema = "dbo" на Schema = "dbo" - что?
Винсент Бускарелло
0

Это могло быть так же глупо, как и в моем случае, когда savechanges ошибался bcoz, у db не было внешних ключей, и ассоциации были добавлены в таблицы EDM. Я добавил внешние ключи в базу данных и восстановил EDM для исправления.

Я видел следующие ошибки: Случай 1 -> при использовании DBContext для EDM Сообщение = Значение не может быть нулевым. Имя параметра: источник в System.Linq.Enumerable.Any [TSource] ( 1 source, Funcпредикат IEnumerable 2)

Случай 2 -> при использовании ObjectContext для EDM Сообщение = Невозможно обновить EntitySet «Контакт», потому что у него есть DefiningQuery и в элементе нет элемента, поддерживающего текущую операцию.

(Просто хотел бросить туда на случай, если это кому-то поможет).

cunderpants
источник
0

В MVC экран просмотра вызывает метод, который находится в Controller или Repository.cs, и присваивает возвращаемое значение любому элементу управления в CSHTML, но этот метод фактически не реализован в .cs / controller, тогда CSHTML выдаст исключение параметра NULL

Муру Бактхавачалам
источник
0

Я получил эту ошибку, когда у меня был недопустимый тип для свойства сущности.

public Type ObjectType {get;set;}

Когда я удалил свойство, ошибка перестала появляться.

Кирстен Жадность
источник
0

В моем случае проблема возникла при настройке веб-приложения в IIS. Когда была запущена команда обновления для любой записи, эта ошибка генерировалась.

Это была проблема с разрешением для App_Data, который был установлен только для чтения. Щелкните папку правой кнопкой мыши, снимите флажок «Только для чтения», и все готово. Кстати, для тестирования я использовал базу данных localdb, которая находилась в папке App_Data.

Сунил Джатолия
источник
0

Моя ошибка заключалась в том, что я забыл добавить .ThenInclude (s => s.SubChildEntities) к родительскому .Include (c => c.SubChildEntities) к действию контроллера при попытке вызвать 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 (в разделе настройки Startup 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();

Я тоже избавился от этой ошибки.

кутеж
источник
-3

Возьмите строку в базе данных и сделайте все столбцы в этой строке нулевыми, например, "NULL". Теперь передайте это значение NULL, используя try catch или if else.

Джарин Фархад
источник
это ужасная идея
Джейсон Локи Смит