值不能为 null。参数名称:source

Value cannot be null. Parameter name: source

提问人:danielovich 提问时间:4/29/2013 最后编辑:Martin Mulderdanielovich 更新时间:11/1/2023 访问量:589503

问:

这可能是我花了几个小时解决的最大浪费时间的问题。

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

这给了我一个错误

值不能为 null。参数名称:source

堆栈跟踪

[ArgumentNullException:值不能为 null。参数名称:source] System.Linq.Enumerable.Any(IEnumerable2 谓词) +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 ... ...
1 source, Func

我只想向表中添加一个实体。ORM 是 EF。

C# 实体框架 LINQ NullReferenceException

评论

2赞 Ville Salonen 4/29/2013
你可能想研究这个问题及其答案:stackoverflow.com/questions/3244336/......
2赞 MikeTWebb 4/29/2013
collectin 中的一个条目可能具有 null 值:est.price = collection[“price”];est.size = collection[“size”];
2赞 danielovich 4/29/2013
@AshBurlaczenko哦,你觉得呢?我的架构看起来每一列都可以为 null。
3赞 anaximander 4/29/2013
能否发布连接字符串?

答:

290赞 Martin Mulder 4/29/2013 #1

在 DbContext 中的某个位置有一个值,该值是 (或 或 或任何其他 LINQ 方法)查询的,但此值是 .IEnumerableAny()Where()Select()null

确定是否将使用 LINQ 方法的查询放在一起(在示例代码之外的某个位置),或者是否使用了 作为参数,即 。IEnumerablenull

评论

22赞 NibblyPig 6/29/2014
这为我解决了问题,我怀疑这也是 OP 的解决方案,即使公认的答案不同。
13赞 Brian Lacy 12/23/2014
我的答案是,我还没有初始化我试图过滤的列表——它仍然是 ..Where()null
2赞 Fer R 9/14/2017
若要避免此类 null 错误,应尝试在 IEnumerable 属性中放置默认值,或使用 Any() 对其进行测试
1赞 ejcortes 2/13/2020
这为我解决了这个问题。尽管公认的答案不同,但我认为根本原因是一样的:未初始化的集合。也许 OP 不包含连接字符串,或者将其放置在错误的节点上。
1赞 gyousefi 7/17/2020
这是正确答案,与“值不能为空”错误消息相关。此错误与连接字符串无关!
52赞 anaximander 4/29/2013 #2

我前段时间有过这个问题,答案不一定是你所期望的。当连接字符串错误时,通常会弹出此错误消息。

在猜测中,您将需要这样的东西:

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

正在发生的事情是,它在错误的地方寻找数据源;实体框架对它的描述略有不同。如果发布连接字符串和 EF 配置,则可以进行检查。

评论

3赞 jleach 3/15/2016
就我而言,这是代码中不正确的连接字符串,但仍然是一个连接字符串问题。
2赞 Alan Macdonald 9/24/2020
“不一定是你所期望的”,你可以再说一遍
0赞 Deepak Yadav 6/28/2021
是的,您的问题可能不完全相同,但这是一个连接字符串问题,就我而言:我没有设置我之前使用的某些配置的值,现在在配置文件中进行了注释,而是尝试在代码中访问它们。评论说它现在起作用了。
0赞 mercury 5/8/2022
我还重新启动了docker img,它可以正常工作
5赞 johnny 10/11/2013 #3

仅供参考,有人可能会发现它很有用。我为这个错误追了将近 2 天,并且一直在想一些大事并寻找可能是问题的类,最后我发现这是非常愚蠢的问题,它在我的标记 (HTML) 代码中 mypage.ascx.问题是我有一个,它有一个include属性,我在这里列出了一些其他表,错误地有一个表最近从数据库中删除了,我从来没有注意到它与其他实体一起返回null。我刚刚从包含列表中删除了愚蠢的表,我很高兴。希望这可以帮助某人。<asp:EntityDataSource>

1赞 cunderpants 10/24/2013 #4

这可能和我的情况一样愚蠢,因为数据库没有外键并且关联已添加到 EDM 表中,因此 savechanges 出错。我在数据库中添加了外键,并重新生成了 EDM 以进行修复。

我看到的错误如下: 案例 1 -使用 DBContext 进行 EDM 时> Message=Value 不能为 null。 参数名称:source 在 System.Linq.Enumerable.Any[TSource] (IEnumerable2 谓词)1 source, Func

案例 2 -使用 ObjectContext 进行 EDM 时> Message=无法更新 EntitySet“Contact”,因为它具有 DefiningQuery,并且该元素中不存在支持当前操作的元素。

(只是想把它扔在那里,以防它帮助某人)。

1赞 Muru Bakthavachalam 1/16/2014 #5

在MVC中,视图屏幕正在调用控制器或存储库.cs中的方法,并将返回值分配给CSHTML中的任何控件,但该方法实际上未在.cs / controller中实现,则CSHTML将抛出NULL参数异常

14赞 Guy Lowe 8/11/2014 #6

我正在使用 null 过滤器对 DbSet 实例调用 Count,即

dbSet.Count(null);

我发现在此处传递 null 会导致错误,因此如果过滤器为 null,我现在调用无参数方法:

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

这为我解决了这个问题。对于 DbSet 上的任何其他方法,这也可能是一个问题。

2赞 Ahmedk 12/30/2014 #7

使用以下解决方案解决

  1. 右键单击文件,选择“打开方式”和“XML 编辑器”edmx
  2. 在元素中找到实体edmx:StorageModels
  3. 完全删除DefiningQuery
  4. 重命名为 (如果存在)store:Schema="dbo"Schema="dbo"
  5. 删除属性store:Name

评论

0赞 Vincent Buscarello 7/31/2018
Schema=“dbo” 到 Schema=“dbo” -- 什么?
1赞 Kirsten 12/11/2016 #8

当我的实体属性的 Type 无效时,我收到了此错误。

public Type ObjectType {get;set;}

当我删除该属性时,错误停止发生。

1赞 Sunil Jatolia 6/23/2017 #9

就我而言,在IIS上配置Web应用程序时出现了问题,当触发任何记录的更新命令时,都会生成此错误。

这是设置为只读的App_Data上的权限问题。右键单击该文件夹,取消选中“只读”复选框,即可完成。顺便说一句,出于测试目的,我使用了文件夹中App_Data localdb 数据库。

3赞 Franklin Tarter 5/31/2018 #10

以防其他人最终遇到我的DB First Entity Framework设置问题。

长话短说,我需要重载 Entities 构造函数以接受连接字符串,原因是能够使用 Asp.Net Core 依赖项注入容器从 appsettings.json 中提取连接字符串,而不是在调用无参数构造函数时神奇地从 App.config 文件中获取它。

我忘了在新的重载中添加初始化 DbSet 的调用。因此,自动生成的无参数构造函数如下所示:

    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 的调用工作正常(那些不需要那些初始化的 DBSet),而其他调用则抛出 OP 中描述的运行时错误。

2赞 KennethDale1 8/9/2018 #11

确保将存储库注入到服务的构造函数中。这为我解决了这个问题。::啪啪的额头::

4赞 Jared G. 8/29/2018 #12

我的错误是忘记添加.ThenInclude(s => s.SubChildEntities) 添加到父级 .Include(c => c.SubChildEntities) 添加到尝试在 Razor 视图中调用 SubChildEntities 时的控制器操作。

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

应该注意的是,Visual Studio 2017 Community 的 IntelliSense 不会在 .ThenInclude()。不过,它确实成功编译和执行。

1赞 Michael Rivera 3/14/2019 #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),则尤其如此。

安装代理包后,如文档所述,在 DbContext 选项生成器上调用(在启动 DI 设置部分,或配置 DbContext 的任何位置),引发上述异常的导航属性将停止抛出它,并将像 Entity Framework 6 一样工作。.UseLazyLoadingProxies()

评论

1赞 infocyde 2/7/2020
我开始走这条路,在某些情况下它可能会起作用,但我很快就遇到了这个问题 stackoverflow.com/questions/41881169/......
-3赞 Jarin Farhad 4/2/2019 #14

在数据库中取一个 Row,并使该行中的所有列都为 null,如下所示“NULL”。现在使用 try catch 或 if else 传递该 NULL 值。

评论

1赞 Jason Loki Smith 10/28/2019
这是一个可怕的想法
26赞 Sum None 4/14/2019 #15

我刚刚在 .Net Core 2.2 实体框架中遇到了这个确切的错误,因为我没有这样的:set;DbContext

public DbSet<Account> Account { get; }

改为:

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

但是,直到我尝试将 linq 查询与上面提到的其他人一起使用时,它才显示异常。Where()Select()

我试图将设置为只读。我会继续努力的......DbSet

评论

2赞 Sunday 5/29/2020
我只是在尝试将我的程序集与 Linqpad 一起使用时遇到了这个确切的问题。谢谢你,我本可以浪费更多的时间。.Net Core 3.1/EF Core 3.1 在这里。
0赞 Benyamin Limanto 6/11/2022
我只是好奇,如果它是无钥匙实体,为什么我们需要嗯......set;
4赞 Daniel de Zwaan 12/4/2019 #16

如果尝试对 null 集合中的值进行计数,则将返回此异常。

例如,当 Errors 不为 null 时,下面的方法有效,但是,如果 Errors 为 null,则 Value 不能为 null。参数名称:源异常。

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

可以通过检查 null 来避免此异常。

if (graphQLResponse.Errors != null)
1赞 Chamila Maddumage 3/6/2020 #17

我在 XUnit 上遇到了同样的问题。问题出在我的数据库连接上。检查连接字符串是否正确。

1赞 RaZzLe 7/28/2020 #18

而且,就我而言,我错误地将我的两个不同的列定义为 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();

我也摆脱了这个错误。

7赞 Shadi Alnamrouti 1/3/2021 #19

使用不检查是导致此错误的一个重要原因。.Count()null

修复:

if(someList != null & someList.Count()>0)
{
    //Now, put your hackable code here!
}
0赞 Franco 1/28/2022 #20

如果在尝试部署项目时出现此错误,请确保用户帐户具有足够的权限来执行此操作。

0赞 Jeff Widmer 12/20/2023 #21

我已将我的一些实体标记为内部(因为 DbContect 是内部的),然后收到此错误“System.ArgumentNullException:值不能为空。参数名称:source”。

请确保将实体标记为公共实体,而不是内部实体:

internal class MyDbContext : DbContext
{
    internal MyDbContext(string connString) : base(connString) { }

    //Do not use internal; entities must be public for EF to see them.
    //NOT THIS: internal virtual DbSet<Customer> Customers { get; set; }
    public virtual DbSet<Customer> Customers { get; set; }
}