代码之家  ›  专栏  ›  技术社区  ›  No1Lives4Ever

实体框架核心-FromSQL引发ArgumentNullException

  •  0
  • No1Lives4Ever  · 技术社区  · 6 年前

    我使用的是C#(.NETCoreV2.2)和EFCore。我有很老的密码 正在从数据库检索行:

    string id = "123";
    using (var context = new UsersDb())
    {
        var req = context.ScanRequests.FromSql($"EXEC GetById {id}").FirstOrDefault();
        // ...
    }
    

    GetById 是一个存储过程,用azuresql编写(基本上是-sqlserver)。

    此代码最近开始引发异常:

    System.ArgumentNullException: Value cannot be null.
    Parameter name: key
       at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
       at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
       at lambda_method(Closure , ServiceProviderEngineScope )
       at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
       at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
       at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
       at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
       at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
       at Microsoft.EntityFrameworkCore.DbContext.get_Model()
       at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityType()
       at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityQueryable()
       at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Linq.IQueryable.get_Provider()
       at Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSql[TEntity](IQueryable`1 source, FormattableString sql)
       at ***.***Factory.<>c__DisplayClass0_0.<GetById>b__0() in /tmp/sources/SystemLayer/***/***.cs:line 29
    

    当我在本地环境中使用相同的参数运行相同的代码时,这个问题不会发生在我身上。

    更新1

    为了确保哪个是有问题的行(创建进程或运行 FromSql

    var req = context.ScanRequests.FromSql($"EXEC GetById {id}").FirstOrDefault();
    

    更新2

    我想问题可能是因为我映射到了数据库-可能数据库模式已经更改,而没有相应地更改EF。所以我再次运行mapping命令:

    Scaffold-DbContext "cs" ...
    

    我用EF Nuget包2.2.1运行代码。我看到我可以将EF包更新到2.2.2。我做了,但没有解决问题。同样的行为。

    0 回复  |  直到 6 年前
        1
  •  3
  •   Slava Utesinov    6 年前

    你可能认为 $"EXEC GetById {id}" 是一个 string ,但实际上是 FormattableString

    at Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSql[TEntity](IQueryable`1 source, FormattableString sql)
    

    另一个 方法。尝试将显式强制转换添加到 一串

    var req = context.ScanRequests.FromSql((string)$"EXEC GetById {id}").FirstOrDefault();