值不能为 null。参数名: source

201

这可能是我花了很长时间解决的最大的浪费时间问题。

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(IEnumerable1 source, Func2 predicate) +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。


2
你可能想看一下这个问题及其答案:https://dev59.com/mnA75IYBdhLWcg3wg5js - Ville Salonen
2
可能集合中的某个条目具有空值:est.price = collection["price"]; est.size = collection["size"]; - MikeTWebb
2
@AshBurlaczenko 哦,你这么认为吗?我的模式看起来好像每个列都可以为空。 - danielovich
3
请提供你的连接字符串。 - anaximander
20个回答

289
在 DbContext 内部的某个地方,有一个值是 IEnumerable,并且使用 Any()(或 Where() 或 Select() 或任何其他 LINQ 方法)进行查询,但该值为 null。
请查找是否在您的示例代码之外的某个地方组合了一个查询,您在该查询中使用了一个 LINQ 方法,或者使用了一个为 null 的 IEnumerable 参数。

22
这对我解决了问题,我怀疑这也是原帖作者的解决方案,即使被接受的答案不同。 - NibblyPig
13
对我来说,答案是我尚未初始化我试图用 .Where() 进行过滤的列表——它仍然是 null - Brian Lacy
2
为了避免这种空错误,您应该在IEnumerable属性中尝试放置默认值或使用Any()进行测试。 - Fer R
3
为什么下面那个得到140多个赞的答案要比其他被评分较低的答案更靠前呢? - nldev
5
这个答案排名较低,因为它不是被采纳的答案。第一个答案可能是原帖提问者所需要的正确答案。而这个答案则可能是其他许多人所需要的正确答案。 - Martin Mulder
显示剩余5条评论

52

我之前遇到过这个问题,答案可能并不是你所期望的。当你的连接字符串错误时,经常会出现此错误消息。

猜测你需要像这样的东西:

<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 配置,我们可以进行检查。


3
在我的情况下,代码中的连接字符串有误,但仍然是一个连接字符串问题。 - jleach
2
"不一定是你所期望的", 你可以再说一遍。 - Alan Macdonald
是的,你的问题可能不完全相同,但它是一个连接字符串问题。在我的情况下:我没有设置一些配置的值,这些配置我之前使用过并且现在在配置文件中注释掉了,但是在代码中尝试访问它们。将其全部注释后,现在它可以工作了。 - Deepak Yadav
我也重新启动了 Docker 镜像,现在它可以正常工作了。 - mercury

26

我在 .Net Core 2.2 Entity Framework 中遇到了这个精确的错误,因为我没有在我的 DbContext 中加入 set;,像这样:

public DbSet<Account> Account { get; }

更改为:

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

然而,直到我尝试使用像其他人提到的Where()Select()这样的linq查询时,才显示了异常。

我试图将DbSet设置为只读。 我会继续尝试...


2
我在尝试将我的汇编与Linqpad一起使用时遇到了这个确切的问题。谢谢你,否则我可能会浪费更多的时间。这里是.Net Core 3.1/EF Core 3.1。 - Sunday
1
谢谢!它为我节省了无数个小时。.NET 5.0 Core - joseluisrod
1
哈哈,我的 DbSets 上没有 Getters 或 Setters。 - samneric
1
谢谢,我犯了一个愚蠢的错误,没有使用get或set! - Barnsley
我只是好奇,如果这是无需键的实体,为什么我们需要有 set; 呢... - Benyamin Limanto

14

我正在使用一个空过滤器对DbSet的实例调用Count方法,即:

dbSet.Count(null);

我发现在这里传递null导致了错误,所以如果过滤器为null,我现在调用无参数方法:

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

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


7

在没有检查null的情况下使用.Count()是导致此错误的一个主要原因。

解决方法:

if(someList != null & someList.Count()>0)
{
    //Now, put your hackable code here!
}

你好,能否请您检查一下我的帖子,如何检查.Count是否为空,这是我的错误,在这一行中也出现了相同的错误:@for (int i = 0; i < Model.Count(); i++)。您能否请检查一下我的帖子:https://stackoverflow.com/questions/76337895/why-i-got-error-value-cannot-be-null-parameter-name-source。谢谢! - Ziad Adnan

5

顺便说一下,这可能对某些人有用。我为了解决这个错误而奔波了近两天,一直在想是哪些类出了问题,最终发现是一个非常愚蠢的问题,而且它出现在我的页码(HTML)代码中的mypage.ascx文件中。问题在于我有一个<asp:EntityDataSource>,它有一个包含属性,我在这里列出了一些其他的表格,不小心将一个最近从数据库中删除的表格列出,并没有注意到它正在与其他实体一起返回空值。我只需从包含列表中删除这个愚蠢的表格就可以了。希望这能帮助到某些人。


4

如果您尝试在空集合中计数值,将返回此异常。

例如,当Errors不为null时,以下操作正常运行。但是,如果Errors为null,则会出现"值不能为null。参数名:source"的异常。

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

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

if (graphQLResponse.Errors != null)

4

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

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

需要注意的是,Visual Studio 2017 Community的IntelliSense在.ThenInclude()中的lambda表达式中无法识别SubChildEntities对象。但是它可以成功编译和执行。


我也遇到了同样的问题! - Thomas

3

如果有其他人遇到了我这个关于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工作得很好(那些不需要初始化DBSet的调用),而其他调用会引发OP中描述的运行时错误。


2

请确保将仓库注入到服务的构造函数中。这对我解决了问题。 ::拍了拍额头::


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接