[英]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();
这给了我一个错误
值不能为空。 参数名称:来源
堆栈跟踪
[ArgumentNullException:值不能为空。 参数名:source] System.Linq.Enumerable.Any(IEnumerable
1 source, Func
2 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。
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 配置,那么我们可以检查。
我刚刚在 .Net Core 2.2 Entity Framework 中遇到了这个确切的错误,因为我没有set;
在我的DbContext
像这样:
public DbSet<Account> Account { get; }
变成:
public DbSet<Account> Account { get; set;}
但是,直到我尝试使用带有Where()
和Select()
的 linq 查询,正如其他人在上面提到的那样,它才显示异常。
我试图将DbSet
设置为只读。 我会继续努力...
我在 DbSet 的一个实例上调用 Count,过滤器为空,即
dbSet.Count(null);
我发现在这里传递 null 会导致错误,所以如果过滤器为 null,我现在调用无参数方法:
if (filter == null)
{
return dbSet.Count();
}
else
{
return dbSet.Count(filter);
}
这为我解决了问题。 这对于 DbSet 上的任何其他方法也可能是一个问题。
仅供参考,有人可能会发现它很有用。 将近 2 天,我一直在为这个错误追赶我的尾巴,并且一直在想一些大事并寻找可能是问题的类,最后我发现这是一个非常愚蠢的问题,它在 mypage.ascx 中的标记(HTML)代码中. 问题是我有一个<asp:EntityDataSource>
并且它有一个包含属性,我在这里列出了一些其他表,并且错误地有一个表最近已从数据库中删除,我从未注意到它返回 null 与其他实体。 我刚刚从包含列表中删除了愚蠢的表,我很高兴。 希望这可以帮助某人。
使用.Count()
而不检查null
是此错误的一个重要原因。
修复:
if(someList != null & someList.Count()>0)
{
//Now, put your hackable code here!
}
以防其他人在这里遇到我的 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 中描述的运行时错误。
如果您尝试对空集合中的值进行计数,将返回此异常。
例如,当 Errors 不为 null 时,以下内容有效,但是如果 Errors 为 null,则Value 不能为 null。 参数名称:发生源异常。
if (graphQLResponse.Errors.Count() > 0)
可以通过检查 null 来避免此异常。
if (graphQLResponse.Errors != null)
用以下解决方案解决
edmx
文件,选择打开方式,XML 编辑器edmx:StorageModels
元素中找到实体DefiningQuery
store:Schema="dbo"
重命名为Schema="dbo"
(如果存在)store:Name
属性确保将存储库注入到服务的构造函数中。 这为我解决了它。 ::敲打额头::
这可能和我的情况一样愚蠢,即 savechanges 出错,因为 db 没有外键,并且关联已添加到 EDM 表中。 我在数据库中添加了外键并重新生成了 EDM 以进行修复。
我看到的错误如下:案例 1 -> 将 DBContext 用于 EDM 时消息 = 值不能为空。 参数名称:Source at System.Linq.Enumerable.Any[TSource](IEnumerable 1 source, Func
2 predicate)
情况 2 -> 将 ObjectContext 用于 EDM 消息时=无法更新 EntitySet 'Contact',因为它有一个 DefiningQuery 并且元素中不存在支持当前操作的元素。
(只是想把它扔在那里以防它帮助某人)。
在 MVC 中,View screen 调用 Controller 或 Repository.cs 中的方法并将返回值分配给 CSHTML 中的任何控件,但该方法实际上并未在 .cs/controller 中实现,然后 CSHTML 将抛出 NULL 参数异常
当我的实体属性的类型无效时出现此错误。
public Type ObjectType {get;set;}
当我删除该属性时,错误停止发生。
就我而言,在 IIS 上配置 Web 应用程序时出现了问题,当触发任何记录上的更新命令时,就会生成此错误。
这是设置为只读的 App_Data 的权限问题。 右键单击该文件夹,取消选中只读复选框,您就完成了。 顺便说一句,出于测试目的,我使用的是 App_Data 文件夹中的 localdb 数据库。
我的错误是在尝试在 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 对象。 它确实成功编译和执行。
我知道这距离问题的 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 选项构建器上调用.UseLazyLoadingProxies()
(在您的启动 DI 设置部分,或您配置 DbContext 的任何位置),并且引发上述异常的导航属性将停止扔它,并将像以前的实体框架 6 一样工作。
我对 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”。现在使用 try catch 或 if else 传递该 NULL 值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.