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


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

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


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собственность

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 и в элементе нет элемента, поддерживающего текущую операцию.

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


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.


это ужасная идея
— Джейсон Локи Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.