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

时间:2013-04-29 14:24:53

标签: 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();

这给了我一个错误

  

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

的堆栈跟踪
  

[ArgumentNullException:Value不能为null。参数名称:来源]   System.Linq.Enumerable.Any(IEnumerable 1 source, Func 2谓词)   +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。

19 个答案:

答案 0 :(得分:140)

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

查看是否将查询放在一起(在示例代码之外的某处)使用LINQ方法,或者使用IEnumerable作为NULL参数。

答案 1 :(得分:35)

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

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

<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 :(得分:10)

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

我在一个DbSet实例上调用了Count,其中包含一个null的过滤器,即

dbSet.Count(null);

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

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

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

答案 3 :(得分:3)

就像一个FYI,有人可能会发现它很有用。我差不多2天追逐我的尾巴这个错误并且总是在考虑可能是问题的类,最后我发现它非常愚蠢的问题,它是在mypage.ascx中我的标记(HTML)代码。问题是我有一个<asp:EntityDataSource>,这有一个包含属性,我在这里列出了一些其他的表,错误的是最近从数据库中删除了一个表,我从来没有注意到它和其他人一起返回null实体。我刚从包含列表中删除了愚蠢的表格,我很高兴。希望这可以帮助别人。

答案 4 :(得分:1)

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

解决办法:

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

长话短说,我需要重载Entities构造函数以接受连接字符串,原因是能够使用Asp.Net Core依赖注入容器从appsettings.json中提取连接字符串,而不是神奇地从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的一些调用工作得很好(那些不需要那些初始化的DBSets的调用),其他调用抛出了OP中描述的运行时错误。 / p>

答案 7 :(得分:1)

解决了以下解决方案

  1. 右键单击edmx文件,选择Open with,XML editor
  2. 在edmx:StorageModels元素
  3. 中找到实体
  4. 完全删除DefiningQuery
  5. 将商店重命名为:Schema =“dbo”为Schema =“dbo”(如果存在)
  6. 删除商店:名称属性

答案 8 :(得分:0)

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

public Type ObjectType {get;set;}

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

答案 9 :(得分:0)

在我的情况下,在IIS上配置Web应用程序时弹出问题,当触发任何记录上的更新命令时,会生成此错误。

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

答案 10 :(得分:0)

在MVC中,View屏幕是调用Controller或Repository.cs中的方法,并将返回值赋给CSHTML中的任何控件,但该方法实际上没有在.cs / controller中实现,那么CSHTML将抛出NULL参数异常< / p>

答案 11 :(得分: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对象。它确实可以成功编译并执行。

答案 12 :(得分:0)

我知道这距离问题的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(),并调用抛出的导航属性上述异常将停止抛出该异常,并且将像过去使用Entity Framework 6一样工作。

答案 13 :(得分:0)

在数据库中占一行,并使该行中的所有列都为null,例如“ NULL”。现在,使用try catch或其他方式传递该NULL值。

答案 14 :(得分:0)

我刚在.Net Core 2.2实体框架中遇到此确切错误,因为我的set;中没有DbContext,就像这样:

public DbSet<Account> Account { get; }

更改为:

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

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

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

答案 15 :(得分:0)

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

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

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

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

if (graphQLResponse.Errors != null)

答案 16 :(得分:0)

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

答案 17 :(得分: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();

我也摆脱了这个错误。

答案 18 :(得分:0)

在我的情况下,如果保存更改错误bcoz,db可能没有外键,并且关联被添加到EDM表中,这可能是愚蠢的。我在db中添加了外键并重新生成了EDM以进行修复。

我看到的错误如下: 案例1 - &gt;使用DBContext进行EDM时 Message = Value不能为null。 参数名称:source 在System.Linq.Enumerable.Any [TSource](IEnumerable 1 source, Func 2谓词)

案例2 - &gt;使用ObjectContext进行EDM时 Message =无法更新EntitySet'Contact',因为它有一个DefiningQuery,元素中不存在支持当前操作的元素。

(只是想把它丢进去,以防有人帮忙)。