提问人:danielovich 提问时间:4/29/2013 最后编辑:Martin Mulderdanielovich 更新时间:11/1/2023 访问量:589503
值不能为 null。参数名称:source
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();
这给了我一个错误
值不能为 null。参数名称:source
堆栈跟踪
[ArgumentNullException:值不能为 null。参数名称:source] System.Linq.Enumerable.Any(IEnumerable2 谓词) +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 ... ...1 source, Func
我只想向表中添加一个实体。ORM 是 EF。
答:
在 DbContext 中的某个位置有一个值,该值是 (或 或 或任何其他 LINQ 方法)查询的,但此值是 .IEnumerable
Any()
Where()
Select()
null
确定是否将使用 LINQ 方法的查询放在一起(在示例代码之外的某个位置),或者是否使用了 作为参数,即 。IEnumerable
null
评论
.Where()
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 配置,则可以进行检查。
评论
仅供参考,有人可能会发现它很有用。我为这个错误追了将近 2 天,并且一直在想一些大事并寻找可能是问题的类,最后我发现这是非常愚蠢的问题,它在我的标记 (HTML) 代码中 mypage.ascx.问题是我有一个,它有一个include属性,我在这里列出了一些其他表,错误地有一个表最近从数据库中删除了,我从来没有注意到它与其他实体一起返回null。我刚刚从包含列表中删除了愚蠢的表,我很高兴。希望这可以帮助某人。<asp:EntityDataSource>
这可能和我的情况一样愚蠢,因为数据库没有外键并且关联已添加到 EDM 表中,因此 savechanges 出错。我在数据库中添加了外键,并重新生成了 EDM 以进行修复。
我看到的错误如下:
案例 1 -使用 DBContext 进行 EDM 时>
Message=Value 不能为 null。
参数名称:source
在 System.Linq.Enumerable.Any[TSource] (IEnumerable2 谓词)1 source, Func
案例 2 -使用 ObjectContext 进行 EDM 时> Message=无法更新 EntitySet“Contact”,因为它具有 DefiningQuery,并且该元素中不存在支持当前操作的元素。
(只是想把它扔在那里,以防它帮助某人)。
在MVC中,视图屏幕正在调用控制器或存储库.cs中的方法,并将返回值分配给CSHTML中的任何控件,但该方法实际上未在.cs / controller中实现,则CSHTML将抛出NULL参数异常
我正在使用 null 过滤器对 DbSet 实例调用 Count,即
dbSet.Count(null);
我发现在此处传递 null 会导致错误,因此如果过滤器为 null,我现在调用无参数方法:
if (filter == null)
{
return dbSet.Count();
}
else
{
return dbSet.Count(filter);
}
这为我解决了这个问题。对于 DbSet 上的任何其他方法,这也可能是一个问题。
使用以下解决方案解决
- 右键单击文件,选择“打开方式”和“XML 编辑器”
edmx
- 在元素中找到实体
edmx:StorageModels
- 完全删除
DefiningQuery
- 重命名为 (如果存在)
store:Schema="dbo"
Schema="dbo"
- 删除属性
store:Name
评论
当我的实体属性的 Type 无效时,我收到了此错误。
public Type ObjectType {get;set;}
当我删除该属性时,错误停止发生。
就我而言,在IIS上配置Web应用程序时出现了问题,当触发任何记录的更新命令时,都会生成此错误。
这是设置为只读的App_Data上的权限问题。右键单击该文件夹,取消选中“只读”复选框,即可完成。顺便说一句,出于测试目的,我使用了文件夹中App_Data localdb 数据库。
以防其他人最终遇到我的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 中描述的运行时错误。
确保将存储库注入到服务的构造函数中。这为我解决了这个问题。::啪啪的额头::
我的错误是忘记添加.ThenInclude(s => s.SubChildEntities) 添加到父级 .Include(c => c.SubChildEntities) 添加到尝试在 Razor 视图中调用 SubChildEntities 时的控制器操作。
var <parent> = await _context.Parent
.Include(c => c.<ChildEntities>)
.ThenInclude(s => s.<SubChildEntities>)
.SingleOrDefaultAsync(m => m.Id == id);
应该注意的是,Visual Studio 2017 Community 的 IntelliSense 不会在 .ThenInclude()。不过,它确实成功编译和执行。
我知道这与问题的 2013 年还有很长的路要走,但如果在将 ASP.NET 5 应用程序迁移到 ASP.NET Core 时没有启用延迟加载,然后尝试升级到 Entity Framework Core 2.x(从 EF 6)。Entity Framework Core 已将延迟加载代理支持移至单独的包中,因此必须安装它。
如果加载的只是一个 Entity Framework Core Sql Server 包(可以很好地打开 Entity Framework),则尤其如此。
安装代理包后,如文档所述,在 DbContext 选项生成器上调用(在启动 DI 设置部分,或配置 DbContext 的任何位置),引发上述异常的导航属性将停止抛出它,并将像 Entity Framework 6 一样工作。.UseLazyLoadingProxies()
评论
在数据库中取一个 Row,并使该行中的所有列都为 null,如下所示“NULL”。现在使用 try catch 或 if else 传递该 NULL 值。
评论
我刚刚在 .Net Core 2.2 实体框架中遇到了这个确切的错误,因为我没有这样的:set;
DbContext
public DbSet<Account> Account { get; }
改为:
public DbSet<Account> Account { get; set;}
但是,直到我尝试将 linq 查询与上面提到的其他人一起使用时,它才显示异常。Where()
Select()
我试图将设置为只读。我会继续努力的......DbSet
评论
set;
如果尝试对 null 集合中的值进行计数,则将返回此异常。
例如,当 Errors 不为 null 时,下面的方法有效,但是,如果 Errors 为 null,则 Value 不能为 null。参数名称:源异常。
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();
我也摆脱了这个错误。
使用不检查是导致此错误的一个重要原因。.Count()
null
修复:
if(someList != null & someList.Count()>0)
{
//Now, put your hackable code here!
}
如果在尝试部署项目时出现此错误,请确保用户帐户具有足够的权限来执行此操作。
我已将我的一些实体标记为内部(因为 DbContect 是内部的),然后收到此错误“System.ArgumentNullException:值不能为空。参数名称:source”。
请确保将实体标记为公共实体,而不是内部实体:
internal class MyDbContext : DbContext
{
internal MyDbContext(string connString) : base(connString) { }
//Do not use internal; entities must be public for EF to see them.
//NOT THIS: internal virtual DbSet<Customer> Customers { get; set; }
public virtual DbSet<Customer> Customers { get; set; }
}
下一个:引用为空,但数据库有数据
评论