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



我得到这个错误:

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

Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable1.Enumerator.MoveNext() at System.Collections.Generic.List1.ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source(
在ReportCrewApi.Services.ViewMastereIsAktifServices.GetMastereIsAktifs((中,位于D:\Punya Ricky\Works\Insosys\Local\neneneba API for report\ReportCrewApi\Services\ViewMastereIsAketifServices.cs:line 26

我以前尝试过使用string?,但当我查看这个文档时,对于字符串,引用将是可以为null的,所以我没有使用它。但我一直收到同样的错误。我已经在数据库上查看了我的数据

数据库表中的列:

(<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),>)

我试着比较我的数据模型,但没有什么不同。

这是我的模型类:

public class ViewMastereIsAktif
{
[Key]
[StringLength(10)]

public string NIK { get; set; }
[StringLength(10)]
public string NIK_lama  {get; set;}
[StringLength(100)]
public string Nama { get; set; }
[StringLength(20)]
public string KodeOrganisasi { get; set; }
[StringLength(255)]
public string Unit { get; set; }
[StringLength(50)]
public string Jabatan { get; set; }
#nullable enable
public int? KodeLokasi { get; set; }
[StringLength(100)]
public string LokasiKerja { get; set; }
#nullable enable
public int? KodeManajemen { get; set; }
[StringLength(30)]
public string ManajemenLevel { get; set; }
#nullable enable
public DateTime? TanggalMasuk { get; set; }
#nullable enable
public DateTime? TanggalDiangkat { get; set; }
#nullable enable
public int? KodeStatus { get; set; }
[StringLength(100)]
public string StatusHubunganKerja { get; set; }
#nullable enable
public DateTime? TanggalLahir { get; set; }
#nullable enable
public int? BulanLahir { get; set; }
#nullable enable
public int? KodeKelamin { get; set; }
[StringLength(20)]
public string JenisKelamin { get; set; }
#nullable enable
public int? KodePerkawinan { get; set; }
[StringLength(100)]
public string StatusPerkawinan { get; set; }
#nullable enable
public int? KodePerumahan { get; set; }
[StringLength(100)]
public string StatusPerumahan { get; set; }
#nullable enable
public char Owner { get; set; }
#nullable enable
public int? JumlahAnak { get; set; }
[StringLength(50)]
public string Kp { get; set; }
[StringLength(20)]
public string Ko { get; set; }
#nullable enable
public int? umur { get; set; }
#nullable enable
public Int16 TahunMasaKerja { get; set; }
#nullable enable
public Int16 BulanMasaKerja { get; set; }
#nullable enable
public int? KodeAgama { get; set; }
[StringLength(100)]
public string Agama { get; set; }
[StringLength(25)]
public string TempatLahir { get; set; }
#nullable enable
public int? KodeDarah { get; set; }
[StringLength(100)]
public string Darah { get; set; }
[StringLength(100)]
public string Alamat { get; set; }
[StringLength(200)]
public string SekolahK { get; set; }
[StringLength(200)]
public string LokasiK { get; set; }
[StringLength(200)]
public string JurusanK { get; set; }
#nullable enable
public int? TahunK { get; set; }
#nullable enable
public float IPK { get; set; }
#nullable enable
public int? KodePendidikan { get; set; }
[StringLength(100)]
public string Pendidikan { get; set; }
#nullable enable
public int? KodeTransportasi { get; set; }
[StringLength(100)]
public string Transportasi { get; set; }
#nullable enable
public int? CountHobi { get; set; }
#nullable enable
public int? CountBahasa { get; set; }
[StringLength(4)]
public string LokasiAbsen { get; set; }
[StringLength(25)]
public string NomorHP { get; set; }
[StringLength(5)]
public string GolonganHP { get; set; }
[StringLength(40)]
public string NoKTP { get; set; }
[StringLength(25)]
public string NoAstek { get; set; }
[StringLength(50)]
public string NoBPJSKesehatan { get; set; }
[StringLength(20)]
public string Passport { get; set; }
[StringLength(15)]
public string Initial { get; set; }
#nullable enable
public Byte? KepesertaanPensiun { get; set; }
[StringLength(20)]
public string BebanKp { get; set; }
#nullable enable
public char BebanKo { get; set; }
[StringLength(255)]
public string BebanUnit { get; set; }
[StringLength(50)]
public string NamaPasangan { get; set; }
#nullable enable
public int? TanggalLahirPasangan { get; set; }
#nullable enable
public int? UmurPasangan { get; set; }
[StringLength(100)]
public string AlamatKTP { get; set; }
#nullable enable
public DateTime? TanggalAwalPerjanjian { get; set; }
#nullable enable
public DateTime? TanggalAkhirPerjanjian { get; set; }
#nullable enable
public DateTime? RecentTglAwalPerjanjian { get; set; }
#nullable enable
public DateTime? RecentTglAkhirPerjanjian { get; set; }
#nullable enable
public DateTime? RecentTglMulaiMutasi { get; set; }
#nullable enable
public DateTime? RecentTglSelesaiMutasi { get; set; }
#nullable enable
public DateTime? TanggalPHK { get; set; }
#nullable enable
public int? BulanPHK { get; set; }
[StringLength(25)]
public string NoPolisi { get; set; }
[StringLength(25)]
public string Telepon { get; set; }
[StringLength(50)]
public string NPWP { get; set; }
[StringLength(20)]
public string SIM { get; set; }
[StringLength(6)]
public string KodePos { get; set; }
[StringLength(25)]
public string ExtensionTelpon { get; set; }
#nullable enable
public int? KodePHK { get; set; }
[StringLength(100)]
public string KeteranganPHK { get; set; }
[StringLength(300)]
public string unit_cnn { get; set; }
[StringLength(300)]
public string posisi_cnn { get; set; }
[StringLength(10)]
public string tgl_mulai_cnn { get; set; }
[StringLength(10)]
public string tgl_selesai_cnn { get; set; }
[StringLength(100)]
public string no_sk_cnn { get; set; }
[StringLength(100)]
public string lokasi_kerja_cnn { get; set; }
#nullable enable
public int? NoAkun { get; set; }
#nullable enable
public int? KodeSukuUsaha { get; set; }
#nullable enable
public int? NamaSukuUsaha { get; set; }
[StringLength(200)]
public string email { get; set; }
[StringLength(255)]
public string UnitShortName { get; set; }
[StringLength(255)]
public string Hobby { get; set; }
[StringLength(50)]
public string rekening_nama { get; set; }
[StringLength(50)]
public string rekening_no { get; set; }
[StringLength(30)]
public string NamaAnak1 { get; set; }
#nullable enable
public DateTime? TanggalLahirAnak1 { get; set; }
[StringLength(30)]
public string NamaAnak2 { get; set; }
#nullable enable
public DateTime? TanggalLahirAnak2 { get; set; }
[StringLength(30)]
public string NamaAnak3 { get; set; }
#nullable enable
public DateTime? TanggalLahirAnak3 { get; set; }
[StringLength(30)]
public string NamaAnak4 { get; set; }
#nullable enable
public DateTime? TanggalLahirAnak4 { get; set; }
[StringLength(50)]
public string division_code { get; set; }
[StringLength(300)]
public string division_name { get; set; }
[StringLength(50)]
public string department_code { get; set; }
[StringLength(300)]
public string department_name { get; set; }
#nullable enable
public Byte? kode_divisi_statistik { get; set; }
[StringLength(30)]
public string nama_divisi_statistik { get; set; }
#nullable enable
public Int16 kode_sts_kry_statistik { get; set; }
[StringLength(50)]
public string nama_sts_kry_statistik { get; set; }
[StringLength(50)]
public string directorate_code { get; set; }
[StringLength(300)]
public string directorate_name { get; set; }
}

在我检查文档之前,我已经尝试过使用#nullable enablepublic string? Property {get; set} = null的所有方法,我也在其他问题中搜索过它(实际上在这里(,但他们都说没有使用string?,当它说我的字符串为空时,错误指向我的服务

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;
}
}

我真的怀疑问题出在模型上,因为我收到了模型上的警告,说

不可为null的属性"LokasiKerja"在退出构造函数时必须包含非null值。请考虑将该属性声明为可为null。

并且该属性之后的每个字符串都会给我相同的警告(我不明白为什么当属性Jabatan不是时字符串会得到这些警告(,这就是为什么当我试图在poster上运行获取数据时,它会给我错误(在上面的最上面(,我已经在这一点上停留了6个小时。我该如何解决?

当模型期望列为Required时,会发生此错误,即使错误消息特别谈到可为Null性,但这两个概念虽然相关,但在这种情况下是不同的。

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

问题是,哪个模型。。。您还没有标记它,但它看起来像一个OData服务实现(您也提到了poster(

在这种情况下,OData模型似乎是罪魁祸首,在该模型中,我怀疑您的字段被标记为必需

要证明这一点,请找到您的EdmModelbuilder脚本,然后删除LokasiKerja字段的任何Required声明,或者将其放在构建器fluent配置的末尾:

modelBuilder.Entity<ViewMastereIsAktif>()
.Property(x => x.LokasiKerja).IsRequired(false);

现在,当您请求数据馈送时,如果是Required状态导致问题,则错误消息将被解决,或者将引用Required但为null的下一列。

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

在SO上快速搜索可以找到此解决方案,这也可能有助于:https://stackoverflow.com/a/64001223/1690217

FYI错误堆栈将SQL作为原因的原因是由于LINQ延迟逻辑以及OData强加给执行和反序列化的实际SQL的投影。

最新更新