如何解决字符串上可为null的C#SqlNull异常?

如何解决字符串上可为null的C#SqlNull异常?,c#,.net,C#,.net,我得到这个错误: System.Data.SqlTypes.SqlNullValueException:数据为空。无法对空值调用此方法或属性 位于Microsoft.Data.SqlClient.SqlBuffer.ThrowIfNull() 在Microsoft.Data.SqlClient.SqlBuffer.get_String() 位于Microsoft.Data.SqlClient.SqlDataReader.GetString(Int32 i) 在lambda_方法11(闭包、Que

我得到这个错误:

System.Data.SqlTypes.SqlNullValueException:数据为空。无法对空值调用此方法或属性

位于Microsoft.Data.SqlClient.SqlBuffer.ThrowIfNull()
在Microsoft.Data.SqlClient.SqlBuffer.get_String()
位于Microsoft.Data.SqlClient.SqlDataReader.GetString(Int32 i)
在lambda_方法11(闭包、QueryContext、DbDataReader、ResultContext、SingleQueryResultCoordinator)
位于System.Collections.Generic.List的Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryEnumerable
1.Enumerator.MoveNext(),位于System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)的 位于D:\Punya Ricky\Works\Insosys\Local\API for report\ReportCrewApi\Services\ViewMastereIsAktifServices.GetMastereIsAktifs()中的ReportCrewApi.Services.ViewMastereIsAktifServices.GetMastereIsAktifs():第26行

我以前尝试过使用
string?
,但是当我看这个时,对于string,引用将是可为空的,所以我没有使用它。但我总是犯同样的错误。我已经查看了数据库中的数据

数据库表中的列:

       (<NIK, varchar(10),>
       ,<NIK_lama, varchar(10),>
       ,<Nama, varchar(100),>
       ,<KodeOrganisasi, varchar(20),>
       ,<Unit, varchar(255),>
       ,<Jabatan, varchar(50),>
       ,<KodeLokasi, int,>
       ,<LokasiKerja, varchar(100),>
       ,<KodeManajemen, int,>
       ,<ManajemenLevel, varchar(30),>
       ,<TanggalMasuk, datetime,>
       ,<TanggalDiangkat, datetime,>
       ,<KodeStatus, int,>
       ,<StatusHubunganKerja, varchar(100),>
       ,<TanggalLahir, datetime,>
       ,<BulanLahir, int,>
       ,<KodeKelamin, int,>
       ,<JenisKelamin, varchar(20),>
       ,<KodePerkawinan, int,>
       ,<StatusPerkawinan, varchar(100),>
       ,<KodePerumahan, int,>
       ,<StatusPerumahan, varchar(100),>
       ,<Owner, char(1),>
       ,<JumlahAnak, int,>
       ,<Kp, varchar(50),>
       ,<Ko, varchar(20),>
       ,<umur, int,>
       ,<TahunMasaKerja, smallint,>
       ,<BulanMasaKerja, smallint,>
       ,<KodeAgama, int,>
       ,<Agama, varchar(100),>
       ,<TempatLahir, varchar(25),>
       ,<KodeDarah, int,>
       ,<Darah, varchar(100),>
       ,<Alamat, varchar(100),>
       ,<SekolahK, varchar(200),>
       ,<LokasiK, varchar(200),>
       ,<JurusanK, varchar(200),>
       ,<TahunK, int,>
       ,<IPK, float,>
       ,<KodePendidikan, int,>
       ,<Pendidikan, varchar(100),>
       ,<KodeTransportasi, int,>
       ,<Transportasi, varchar(100),>
       ,<CountHobi, int,>
       ,<CountBahasa, int,>
       ,<LokasiAbsen, varchar(4),>
       ,<NomorHP, varchar(25),>
       ,<GolonganHP, varchar(5),>
       ,<NoKTP, varchar(40),>
       ,<NoAstek, varchar(25),>
       ,<NoBPJSKesehatan, varchar(50),>
       ,<Passport, varchar(20),>
       ,<Initial, varchar(15),>
       ,<KepesertaanPensiun, tinyint,>
       ,<BebanKp, varchar(20),>
       ,<BebanKo, char(1),>
       ,<BebanUnit, varchar(255),>
       ,<NamaPasangan, varchar(50),>
       ,<TanggalLahirPasangan, int,>
       ,<UmurPasangan, int,>
       ,<AlamatKTP, varchar(100),>
       ,<TanggalAwalPerjanjian, datetime,>
       ,<TanggalAkhirPerjanjian, datetime,>
       ,<RecentTglAwalPerjanjian, datetime,>
       ,<RecentTglAkhirPerjanjian, datetime,>
       ,<RecentTglMulaiMutasi, datetime,>
       ,<RecentTglSelesaiMutasi, datetime,>
       ,<TanggalPHK, datetime,>
       ,<BulanPHK, int,>
       ,<NoPolisi, varchar(25),>
       ,<Telepon, varchar(25),>
       ,<NPWP, varchar(50),>
       ,<SIM, varchar(20),>
       ,<KodePos, varchar(6),>
       ,<ExtensionTelpon, varchar(25),>
       ,<KodePHK, int,>
       ,<KeteranganPHK, varchar(100),>
       ,<unit_cnn, varchar(300),>
       ,<posisi_cnn, varchar(300),>
       ,<tgl_mulai_cnn, nvarchar(10),>
       ,<tgl_selesai_cnn, nvarchar(10),>
       ,<no_sk_cnn, varchar(100),>
       ,<lokasi_kerja_cnn, varchar(100),>
       ,<NoAkun, int,>
       ,<KodeSukuUsaha, int,>
       ,<NamaSukuUsaha, int,>
       ,<email, varchar(200),>
       ,<UnitShortName, varchar(255),>
       ,<Hobby, varchar(255),>
       ,<rekening_nama, varchar(50),>
       ,<rekening_no, varchar(50),>
       ,<NamaAnak1, varchar(30),>
       ,<TanggalLahirAnak1, datetime,>
       ,<NamaAnak2, varchar(30),>
       ,<TanggalLahirAnak2, datetime,>
       ,<NamaAnak3, varchar(30),>
       ,<TanggalLahirAnak3, datetime,>
       ,<NamaAnak4, varchar(30),>
       ,<TanggalLahirAnak4, datetime,>
       ,<division_code, varchar(50),>
       ,<division_name, varchar(300),>
       ,<department_code, varchar(50),>
       ,<department_name, varchar(300),>
       ,<kode_divisi_statistik, tinyint,>
       ,<nama_divisi_statistik, varchar(30),>
       ,<kode_sts_kry_statistik, smallint,>
       ,<nama_sts_kry_statistik, varchar(50),>
       ,<directorate_code, varchar(50),>
       ,<directorate_name, varchar(300),>)
在检查文档之前,我已经尝试了使用
#null-able-enable
公共字符串的所有操作?属性{get;set}=null
,我在其他问题中用谷歌搜索过它(实际上是在这里),但它们都说相同的,没有使用
string?
,当它说我的字符串为null时,错误指向我的服务

ViewMastereIsAktifServices.cs

public class ViewMastereIsAktifServices : IViewMastereIsAktifServices
{
    private EFRMContext _efrm_context;
    private INVENTORYContext _inventory_context;

    public ViewMastereIsAktifServices(EFRMContext eFRMContext, INVENTORYContext iNVENTORYContext)
    {
        _inventory_context = iNVENTORYContext;
        _efrm_context = eFRMContext;
    }

    public IEnumerable<ViewMastereIsAktif> GetMastereIsAktifs()
    {
        //here is line 26
        var mstIsaktif = _inventory_context.view_mastereisaktif.OrderByDescending(x => x.NIK).ToList();
        return mstIsaktif;
    }
}
public类ViewMastereIsAktifServices:IViewMastereIsAktifServices
{
私有EFRMContext\u efrm\u上下文;
私有库存上下文_库存上下文;
公共ViewMastereIsAktifServices(EFRMContext EFRMContext,INVENTORYContext INVENTORYContext)
{
_库存上下文=库存上下文;
_efrm_context=eFRMContext;
}
公共IEnumerable GetMastereIsAktifs()
{
//这是第26行
var mstIsaktif=_inventory_context.view_mastereisaktif.OrderByDescending(x=>x.NIK.ToList();
返回mstIsaktif;
}
}
我真的怀疑问题出在模型上,因为我得到了模型上的警告

退出构造函数时,不可为null的属性“LokasiKerja”必须包含非null值。考虑将属性声明为可空的。< /P>
该属性之后的每个字符串都给了我相同的警告(我不明白为什么当属性
Jabatan
不存在时字符串会收到这些警告),这就是为什么当我试图运行get-my data on postman时,它给了我错误(在上面最上面),我已经在这一点上停留了6个小时。如何解决这个问题?

当模型希望列是必需的时,会发生此错误,即使错误消息专门讨论可空性。这两个概念虽然相关,但在本例中是不同的

请从模型中删除对
#nullable enable
的多个调用,这是一个编译器指令,在其余代码中是开的或关的,您不断地将其设置为开的,但在这种情况下,我们实际上并不争论该值的可空性,默认情况下,字符串可以为null,并且在这种上下文中可以正常工作

问题是,哪种模式。。。您没有这样标记它,但它看起来像一个OData服务实现(您也提到了postman)

在本例中,似乎OData模型是罪魁祸首,在该模型中,我怀疑您的字段标记为必需

为了证明这一点,请找到EdmModel builder脚本并删除
LokasiKerja
字段的任何
必需的
声明,或者您可以将其放在builder配置的末尾:

modelBuilder.Entity<ViewMastereIsAktif>()
    .Property(x => x.LokasiKerja).IsRequired(false);
modelBuilder.Entity()
.Property(x=>x.LokasiKerja).IsRequired(false);
现在,当您请求数据馈送时,如果是Required状态导致了问题,那么错误消息将被解决,或者将引用下一个Required但为null的列

显示此实体的流畅配置也可能有助于解决此问题

快速搜索SO可找到此解决方案,这也可能有助于:

FYI错误堆栈将我们指向SQL的原因是由于LINQ延迟逻辑和OData对实际执行和反序列化的SQL施加的投影


您使用的框架版本是什么?您的意思是返回
IEnumerable
?这是一种阻塞模式,取决于您的用例。调用
.ToList()
每次都会加载该表中的所有内容。感谢您的回复,我的第26行上仍然有一个null指向,错误与上面相同,即使我删除了可为null的启用,并创建了edmmodel builder。我是否应该在model builder上将每个字段都转换为IsRequired false?如果您有一个约定使所有必需的内容都能正常工作,那么您可以尝试一下,不过,尝试并追踪这些内容的来源也会很好。我想你应该尽一切努力,看看这是否能解决问题
modelBuilder.Entity<ViewMastereIsAktif>()
    .Property(x => x.LokasiKerja).IsRequired(false);