162

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

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

4

20 回答 20

241

DbContext 内部的某处是一个值,该值是IEnumerable使用Any()(或Where()Select()或任何其他 LINQ 方法)查询的值,但该值是null.

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

于 2013-04-29T14:32:16.243 回答
49

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

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

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

于 2013-04-29T14:43:24.933 回答
17

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

public DbSet<Account> Account { get; }

变成:

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

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

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

于 2019-04-13T21:22:06.310 回答
14

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

dbSet.Count(null);

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

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

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

于 2014-08-11T01:35:42.570 回答
5

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

于 2013-10-11T13:45:51.293 回答
4

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

修复:

if(someList != null & someList.Count()>0)
{
    //Now, put your hackable code here!
}
于 2021-01-03T12:47:30.597 回答
3

以防其他人在这里遇到我的 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 中描述的运行时错误。

于 2018-05-30T16:56:07.230 回答
3

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

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

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

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

if (graphQLResponse.Errors != null)
于 2019-12-04T06:01:55.413 回答
2

用以下解决方案解决

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

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

于 2018-08-09T15:39:51.807 回答
1

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

于 2014-01-15T21:06:33.690 回答
1

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

我看到的错误如下:案例 1 -> 将 DBContext 用于 EDM 时消息 = 值不能为空。参数名称:Source at System.Linq.Enumerable.Any[TSource](IEnumerable 1 source, Func2 predicate)

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

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

于 2013-10-24T14:18:07.920 回答
1

我对 XUnit 也有同样的问题。问题出在我的数据库连接上。检查您的连接字符串是否正确。

于 2020-03-06T07:55:34.623 回答
1

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

public Type ObjectType {get;set;}

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

于 2016-12-11T15:11:11.267 回答
1

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

我也摆脱了这个错误。

于 2020-07-28T12:00:50.307 回答
1

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

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

于 2017-06-23T10:33:08.147 回答
1

我知道这距离问题的 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 的任何位置),并且抛出上述异常的导航属性将停止抛出它,并将像以前的实体框架 6 一样工作。

于 2019-03-14T03:25:02.807 回答
1

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

于 2018-08-29T12:51:16.580 回答
0

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

于 2022-01-27T16:43:52.677 回答
-3

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

于 2019-04-01T21:41:15.897 回答