【问题标题】:Value cannot be null. Parameter name: source值不能为空。参数名称:来源
【发布时间】:2013-04-23 06:23:06
【问题描述】:

这可能是我长期以来花费数小时解决的最大浪费时间问题。

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

这给了我一个错误

值不能为空。参数名称:来源

堆栈跟踪

[ArgumentNullException:值不能为空。参数名称:source] System.Linq.Enumerable.Any(IEnumerable1 source, Func2 谓词) +4083335 System.Data.Entity.Internal.InternalContext.WrapUpdateException(UpdateException 更新异常)+87
System.Data.Entity.Internal.InternalContext.SaveChanges() +193
System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +33
System.Data.Entity.DbContext.SaveChanges() +20 ... ...

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

【问题讨论】:

  • 你可能想看看这个问题及其答案:stackoverflow.com/questions/3244336/…
  • 可能collectin中的一个条目有一个空值:est.price = collection["price"]; est.size = 集合["size"];
  • @AshBurlaczenko 哦,你觉得呢?我的架构看起来每一列都可以为空。
  • 你能发布你的连接字符串吗?

标签: c# entity-framework linq nullreferenceexception


【解决方案1】:

我在 DbSet 的实例上调用 Count,过滤器为空,即

dbSet.Count(null);

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

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

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

【讨论】:

    【解决方案2】:

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

    修复:

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

    【讨论】:

      【解决方案3】:

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

      我也摆脱了这个错误。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          通过以下解决方案解决

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

          【讨论】:

          • Schema="dbo" 到 Schema="dbo" -- 什么?
          【解决方案6】:

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

          例如,当 Errors 不为 null 时,以下内容有效,但是如果 Errors 为 null,则 Value 不能为 null。参数名称:源发生异常。

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

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

          if (graphQLResponse.Errors != null)
          

          【讨论】:

            【解决方案7】:

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

            public DbSet<Account> Account { get; }
            

            改为:

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

            但是,直到我尝试使用带有 Where()Select() 的 linq 查询,正如其他人在上面提到的那样,它才显示异常。

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

            【讨论】:

            • 我在尝试将我的程序集与 Linqpad 一起使用时遇到了这个确切的问题。谢谢你,我本可以浪费更多时间。 .Net Core 3.1/EF Core 3.1 在这里。
            • 谢谢!它为我节省了无数个小时。 >net 5.0 核心
            • 干杯...我的 DbSet 上没有 Getter 或 Setter,哈哈
            【解决方案8】:

            在数据库中取一行并将该行中的所有列设为空,如“NULL”。现在使用 try catch 或 if else 传递该 NULL 值。

            【讨论】:

            • 这是个糟糕的主意
            【解决方案9】:

            我知道这距离问题的 2013 年还有很长的路要走,但是如果您在将 ASP.NET 5 应用程序迁移到 ASP.NET Core 时没有启用延迟加载,然后尝试升级到 Entity Framework Core 2.x(从 EF 6)。 Entity Framework Core has moved lazy loading proxy support to a separate package,所以你必须安装它。

            如果您加载的只是一个 Entity Framework Core Sql Server 包(它可以很好地打开 Entity Framework),则尤其如此。

            安装代理程序包后,如文档所述,在 DbContext 选项构建器(在您的启动 DI 设置部分或配置 DbContext 的任何位置)上调用 .UseLazyLoadingProxies(),以及引发上述内容的导航属性异常将停止抛出它,并将像以前的实体框架 6 一样工作。

            【讨论】:

            【解决方案10】:

            我的错误是在尝试在 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 对象。它确实成功编译并执行。

            【讨论】:

              【解决方案11】:

              确保将存储库注入到服务的构造函数中。这为我解决了它。 ::敲打额头::

              【讨论】:

                【解决方案12】:

                以防其他人在这里遇到我的 DB First Entity Framework 设置问题。

                长话短说,我需要重载实体构造函数以接受连接字符串,原因是能够使用 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>();
                    }
                

                这真的让我陷入了一个循环,因为我们的 Respository 中使用 DbContext 的一些调用运行良好(那些不需要那些初始化的 DBSet),而其他调用则抛出了 OP 中描述的运行时错误。

                【讨论】:

                  【解决方案13】:

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

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

                  【讨论】:

                    【解决方案14】:

                    当我的实体属性的类型无效时出现此错误。

                    public Type ObjectType {get;set;}
                    

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

                    【讨论】:

                      【解决方案15】:

                      在 DbContext 中的某处有一个值为 IEnumerable 并使用 Any()(或 Where()Select() 或任何其他 LINQ 方法)进行查询,但此值为 null

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

                      【讨论】:

                      • 这解决了我的问题,我怀疑这也是 OP 的解决方案,即使接受的答案不同。
                      • 我的答案是我还没有初始化我试图用.Where()过滤的列表——它仍然是null
                      • 为避免这种空错误,您应该尝试在 IEnumerable 属性中设置默认值或使用 Any() 测试它们
                      • 这个答案比其他评分低得多的答案有 140+ 的点赞数如何?
                      • 这个答案较低,因为它不是公认的答案。第一个答案可能是原始海报的正确答案。这个答案可能是许多其他人的正确答案。
                      【解决方案16】:

                      在MVC中,View screen调用Controller或Repository.cs中的方法并将返回值分配给CSHTML中的任何控件但该方法实际上没有在.cs/controller中实现,然后CSHTML将抛出NULL参数异常

                      【讨论】:

                        【解决方案17】:

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

                        我看到的错误如下: 案例 1 -> 将 DBContext 用于 EDM 时 Message=Value 不能为空。 参数名称:来源 在 System.Linq.Enumerable.Any[TSource](IEnumerable1 source, Func2 谓词)

                        案例 2 -> 将 ObjectContext 用于 EDM 时 Message=无法更新 EntitySet 'Contact',因为它有一个 DefiningQuery 并且元素中不存在支持当前操作的元素。

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

                        【讨论】:

                          【解决方案18】:

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

                          【讨论】:

                            【解决方案19】:

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

                            您大概需要这样的东西:

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

                            【讨论】:

                            • 在我的情况下,这是代码中不正确的连接字符串,但仍然是连接字符串问题。
                            • “不一定是你所期望的”,你可以再说一遍
                            • 是的,您的问题可能不完全相同,但它是一个连接字符串问题,在我的情况下:我没有设置我之前使用的某些配置的值,现在在配置文件中进行了评论,但尝试在代码中访问它们。评论了它现在工作了。
                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2019-06-12
                            • 2020-08-03
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多