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


129

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

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


7
异常消息不是解释性的吗?空的东西不能为空。您的数据库架构是什么?
Ash Burlaczenko 2013年

你可能要考虑这个问题,它的答案:stackoverflow.com/questions/3244336/...
威乐萨洛宁

1
collectin中的条目之一可能为空值:est.price = collection [“ price”]; est.size = collection [“ size”];
MikeTWebb 2013年

1
@AshBurlaczenko哦,你觉得呢?我的架构看起来每一列都可以为空。
danielovich 2013年

2
您可以发布连接字符串吗?
anaximander 2013年

Answers:


42

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

猜测,您将需要以下内容:

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


2
在我的情况下,这是代码中不正确的混淆字符串,但是仍然存在连接字符串问题。
jleach '16

190

在DbContext内部的某个地方是一个值,该值可以IEnumerable通过Any()Where()Select()或任何其他LINQ方法)查询,但是该值是null

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


7
这解决了我的问题,即使接受的答案不同,我也怀疑这也是OP的解决方案。
NibblyPig 2014年

4
对我来说,答案是我还没有初始化我要过滤的列表,.Where()它仍然是null
Brian Lacy 2014年

1
为了避免这种错误,无效的,你应该可尝试把一个默认值了IEnumerable属性或与任何()对其进行测试
费尔- [R

1
答案比其他低得多的答案低140+的答案如何?
nldev

1
该答案较低,因为它不是可接受的答案。第一个答案可能是原始海报的正确答案。对于许多其他人来说,这个答案可能是正确的答案。
Martin Mulder

11

我的原因与这里的其他人不同,因此我想将其发布给可能遇到此问题的其他任何人。

我在DbSet实例上调用Count,其过滤器为null

dbSet.Count(null);

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

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

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


9

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

public DbSet<Account> Account { get; }

变成:

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

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

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


1
尝试将我的Assembly与Linqpad一起使用时,我遇到了这个确切的问题。谢谢,我本可以浪费更多的时间。.Net Core 3.1 / EF Core 3.1此处。
星期日)

3

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


2

万一其他人最终遇到了我与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中描述的运行时错误。



1

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

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

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

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

if (graphQLResponse.Errors != null)

1

解决以下问题

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

Schema =“ dbo”到Schema =“ dbo”-什么?
文森特·布斯卡洛

0

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

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

情况2->当对EDM使用ObjectContext时Message =无法更新EntitySet'Contact',因为它具有DefiningQuery且元素中不存在任何元素来支持当前操作。

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


0

在MVC中,“查看”屏幕正在调用Controller或Repository.cs中的方法,并将返回值分配给CSHTML中的任何控件,但该方法实际上未在.cs / controller中实现,然后CSHTML将抛出NULL参数异常


0

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

public Type ObjectType {get;set;}

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


0

以我为例,在IIS上配置Web应用程序时出现问题,当在任何记录上触发update命令时,都会生成此错误。

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


0

我的错误是忘记了在尝试在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社区的IntelliSense不会在.ThenInclude()的lambda表达式中拾取SubChildEntities对象。它确实可以成功编译并执行。


0

我知道距问题2013年还有很长一段路要走,但是如果在将ASP.NET 5应用迁移到ASP.NET Core并尝试升级到以下版本时未启用延迟加载,则会出现此症状实体框架核心2.x(来自EF 6)。Entity Framework Core已将延迟加载代理支持移至单独的软件包,因此您必须安装它。

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

在安装代理程序包之后,如文档所述,然后.UseLazyLoadingProxies()在DbContext options构建器上调用(在“启动DI设置”部分,或配置DbContext的任何位置),并且抛出上述异常的导航属性将停止抛出该异常,并将像过去的Entity Framework 6一样工作。


我开始沿着这条道路,并在某些情况下它可能工作,但我遇到了这个很快stackoverflow.com/questions/41881169/...
infocyde


0

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

我也摆脱了这个错误。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.