值不能为空.参数名称:source

dan*_*ich 113 c# asp.net-mvc entity-framework

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

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();
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误

值不能为空.参数名称:source

堆栈跟踪

[ArgumentNullException:Value不能为null.参数名称:source] System.Linq.Enumerable.Any(IEnumerable 1 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.

Mar*_*der 164

DbContext中的某个位置是一个值,IEnumerable并且是Any()(Where()Select()或任何其他LINQ方法)查询的值,但此值为null.

找出是否将查询放在一起(在示例代码之外的某个地方)使用LINQ方法,或者将其IEnumerable用作NULL参数.

  • 这解决了我的问题,我怀疑这也是OP的解决方案,尽管接受的答案是不同的. (5认同)
  • 对我来说,答案是我还没有初始化List我试图用`.Where()`过滤 - 它仍然是'null`. (4认同)
  • 这个答案较低,因为它不是公认的答案。第一个答案可能是原始海报的正确答案。对于许多其他人来说,这个答案可能是正确的答案。 (4认同)
  • 为了避免这种空错误,您应该尝试在 IEnumerable 属性中放置一个默认值或使用 Any() 测试它们 (2认同)
  • 这个答案比其他评级低得多的答案有 140 多个赞成票,怎么样? (2认同)

ana*_*der 38

我有一段时间回来了,答案不一定是你所期待的.当您的连接字符串错误时,通常会出现此错误消息.

猜测一下,你需要这样的东西:

<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>
Run Code Online (Sandbox Code Playgroud)

发生的事情是它正在寻找错误位置的数据源; 实体框架指定它略有不同.如果您发布连接字符串和EF配置,那么我们可以检查.

  • 就我而言,这是代码中不正确的混淆字符串,但是仍然是连接字符串问题。 (2认同)
  • “不一定是你所期望的”,你可以再说一遍 (2认同)

Sum*_*one 14

我只是在.net 2.2核心的实体框架得到这个确切的错误,因为我没有足够的set;在我DbContext像这样:

public DbSet<Account> Account { get; }
Run Code Online (Sandbox Code Playgroud)

变成:

public DbSet<Account> Account { get; set;}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我在尝试将程序集与 Linqpad 一起使用时遇到了这个确切的问题。谢谢你,我本来可以浪费更多的时间。.Net Core 3.1/EF Core 3.1 此处。 (2认同)

Guy*_*owe 11

我的理由与其他人不同,所以我想我会把它发布给其他可能有这个问题的人.

我在一个带有null过滤器的DbSet实例上调用Count,即

dbSet.Count(null);
Run Code Online (Sandbox Code Playgroud)

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

 if (filter == null)
 {
     return dbSet.Count();
 }
 else
 {
     return dbSet.Count(filter);
 }
Run Code Online (Sandbox Code Playgroud)

这为我排序了问题.对于DbSet上的任何其他方法,这可能是一个问题.


Sha*_*uti 7

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

修复:

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


joh*_*nny 5

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