Value cannot be null. Parameter name: source - 值不能为空。参数名称: 源

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

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

这给了我一个错误

Value cannot be null. Parameter name: source

... 的堆栈痕迹

[ ArgumentNullException: Value 不能为 null System.Linq.Enumable.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。

501566 次浏览

在 DbContext 内部的某个地方有一个值,它是 IEnumerable,用 Any()(或 Where()Select()或任何其他 LINQ 方法)查询,但是这个值是 null

查明是否在使用 LINQ- 方法的地方放置了一个查询(在示例代码之外的某个地方) ,或者使用了 IEnumerable作为参数,该参数为 NULL。

我以前有过这个问题,答案不一定是你想要的。当您的连接字符串出错时,此错误消息通常会突然出现。

我猜,你需要这样的东西:

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

仅供参考,也许有人会觉得有用。我为这个错误追了差不多两天,一直在想一些大的问题,寻找可能是问题的类,最后我发现这是一个非常愚蠢的问题,它出现在我在 mypage.ascx 中的 mark up (HTML)代码中。问题是我有一个 <asp:EntityDataSource>这里有一个 include 属性这里列出了一些其他的表最近错误地从数据库中删除了一个表我从来没有注意到它返回 null 和其他实体一起。我刚从包含列表中移除了该死的表,现在可以开始了。希望这个能帮到别人。

在我的例子中,由于 db 没有外键,并且 EDM 表中添加了关联,因此保存更改出错,这种情况可能和我的情况一样愚蠢。我在 db 中添加了外键,并重新生成了 EDM 以进行修复。

我看到的错误如下: 当使用 DBContext 进行 EDM 时,案例1-> Message = Value 不能为空。 参数名称: source 任何[ TSource ](IEnumerable1 source, Func2谓词)

在 EDM 中使用 ObjectContext 时,案例2-> Message = 无法更新 EntitySet‘ Contact’,因为它有一个 Definition ingQuery,而且元素中不存在支持当前操作的元素。

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

在 MVC 中,View screen 调用 Controller 或 Repository.cs 中的方法,并在 CSHTML 中为任何控件分配返回值,但该方法在。Cs/controller,那么 CSHTML 将抛出 NULL 参数异常

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

dbSet.Count(null);

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

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

这对我来说解决了问题,对于 DbSet 上的任何其他方法来说也是一个问题。

用以下解决方案解决

  1. 右键单击 edmx文件,选择 Open with,XML Editor
  2. edmx:StorageModels元素中找到该实体
  3. 完全移除 DefiningQuery
  4. store:Schema="dbo"重命名为 Schema="dbo"(如果存在)
  5. 删除 store:Name属性

当实体属性的 Type 无效时,我得到了这个错误。

public Type ObjectType {get;set;}

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

在我的案例中,在 IIS 上配置 Web 应用程序时出现了问题,当任何记录上的 update 命令被触发时,都会产生这个错误。

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

以防其他人最终在这里与我的问题与数据库第一实体框架设置。

长话短说,我需要重载 Entities 构造函数来接受连接字符串,原因是能够使用 Asp。Net Core 依赖注入容器从 appsetings.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 中描述的运行时错误。

确保将存储库注入到服务的构造函数中,这就解决了我的问题:

我的错误是忘了加上。然后将子实体(s = > s. SubChildEntities)包含到父实体上。当尝试在 Razor 视图中调用 SubChildEntities 时,将(c = > c. SubChildEntities)包含到 Controller 操作中。

var <parent> = await _context.Parent
.Include(c => c.<ChildEntities>)
.ThenInclude(s => s.<SubChildEntities>)
.SingleOrDefaultAsync(m => m.Id == id);

值得注意的是,VisualStudio2017社区的 IntelliSense 不会在。然后包括()。但是它确实成功地编译和执行了。

我知道距离2013年这个问题还有很长的路要走,但是如果你在将 ASP.NET 5应用迁移到 ASP.NET 核心时没有启用延迟加载,然后试图升级到实体框架核心2.x (从 EF 6开始) ,这个症状就会显现出来。实体框架核心已经将延迟加载代理支持移动到一个单独的包中,所以你必须安装它。

如果所加载的都是实体框架核心 Sql 服务器包(它可以很好地打开实体框架) ,则尤其如此。

在安装了代理程序包之后,就像文档说的那样,在 DbContext 选项构建器(在 Startup DI 设置部分,或者任何配置 DbContext 的地方)上调用 .UseLazyLoadingProxies(),抛出上述异常的导航属性将停止抛出异常,并将像实体框架6过去那样工作。

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

我刚刚得到了这个精确的错误。Net Core 2.2 Entity Framework,因为我的 DbContext中没有 set;,如下所示:

public DbSet<Account> Account { get; }

改为:

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

但是,它并没有显示异常,直到我尝试使用带有 Where()Select()的 linq 查询,正如前面提到的那样。

我试着把 DbSet设置为只读,我会继续尝试..。

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

例如,下面的工作时,错误是不为空,但如果错误为空,那么 值不能为空。参数名称: 源异常发生。

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

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

if (graphQLResponse.Errors != null)

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

在我的例子中,我错误地将两个不同的列定义为 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();

我也消除了这个错误。

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

解决办法:

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

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