繁体   English   中英

"<i>Value cannot be null.<\/i>值不能为空。<\/b> <i>Parameter name: source<\/i>参数名称:来源<\/b>"

[英]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)

用以下解决方案解决

  1. 右击edmx文件,选择打开方式,XML 编辑器
  2. edmx:StorageModels元素中找到实体
  3. 完全删除DefiningQuery
  4. store:Schema="dbo"重命名为Schema="dbo" (如果存在)
  5. 删除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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM