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

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

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(IEnumerable 1 source, Func 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.

Ответ 1

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

Полагаю, вам понадобится что-то вроде этого:

<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

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

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

Ответ 3

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

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

dbSet.Count(null);

Я обнаружил, что передача null здесь вызывала ошибку, поэтому теперь я вызываю метод без параметра, если фильтр имеет значение null:

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

Это отсортировало проблему для меня. Это может быть проблемой для любых других методов на DbSet.

Ответ 4

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

Ответ 5

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

1) Щелкните правой кнопкой мыши на файле edmx, выберите Open with, XML editor

2) Найдите объект в элементе edmx: StorageModels

3) Полностью удалить DefiningQuery

4) Переименуйте хранилище: Schema = "dbo" в Schema = "dbo" (если существует)

5) Удалить хранилище: имя свойства

Ответ 6

В случае, если кто-то еще окажется здесь с моей проблемой с установкой 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>();
    }

Это действительно привело меня к циклу, потому что некоторые вызовы в нашем Respository, которые использовали DbContext, работали нормально (те, которые не нуждались в этих инициализированных DBSets), а другие выдают ошибку времени выполнения, описанную в OP.

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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

Ответ 10

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

public Type ObjectType {get;set;}

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

Ответ 11

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

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

Ответ 12

Моя ошибка - забыть добавить .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(). Тем не менее, он успешно компилируется и выполняется.

Ответ 13

Я знаю, что это далеко от вопроса 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), и свойство навигации, которое вызывало указанное выше исключение, будет прекрати его бросать, и будет работать так, как раньше.

Ответ 14

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

Ответ 15

Я получил именно эту ошибку в .Net Core 2.2 Entity Framework, потому что у меня не было set; в моем DbContext так:

public DbSet<Account> Account { get; }

изменился на:

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

Однако, это не показывало исключение, пока я не попытался использовать запрос linq с Where() и Select() как другие упоминали выше.

Я пытался установить DbSet только для чтения. Я буду продолжать пытаться...