检查列表后的NullReference异常不为null

时间:2017-09-20 11:49:29

标签: c# asp.net-core-mvc

我正在Windows笔记本电脑上使用PostgreSQL v9.4数据库开发.net Core web-app。 Web应用程序部署在Debian服务器上,使用相同的.net Core SDK和数据库设置。

我将模型Utente定义为:

public class Utente : IdentityUser<int>
{
    [Display(Name = "Nome")]
    public string Nome { get; set; }

    [Display(Name = "Creato il")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime Creato { get; set; }

    [Display(Name = "Attivato il")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime? Attivato { get; set; }

    [Required]
    [Display(Name = "Creato da")]
    public int? CreatoDaId { get; set; }
    public Utente CreatoDa { get; set; }

    [InverseProperty("CreatoDa")]
    public virtual List<Utente> UtentiCreati { get; set; }
    [InverseProperty("Utente")]
    public virtual List<Invito> InvitiRicevuti { get; set; }
    [InverseProperty("CreatoDa")]
    public virtual List<Invito> InvitiCreati { get; set; }        
    public virtual List<Luogo> LuoghiCreati { get; set; }
    [InverseProperty("CreatoDa")]
    public virtual List<Assegnazione> AssegnazioniCreate { get; set; }
    [InverseProperty("Utente")]
    public virtual List<Assegnazione> Assegnazioni { get; set; }
    [InverseProperty("CreatoDa")]
    public virtual List<Abbonamento> AbbonamentiCreati { get; set; }
    [InverseProperty("Utente")]
    public virtual List<Abbonamento> AbbonamentiSottoscritti { get; set; }
    public virtual List<Accesso> Accessi { get; set; }        
}

然后我按如下方式查询我的数据库:

var utente = await _db.Users
                      .Include(u => u.Roles)
                      .Include(u => u.CreatoDa)
                      .Include(u => u.InvitiRicevuti)
                      .Include(u => u.InvitiCreati)
                      .Include(u => u.UtentiCreati)
                      .Include(u => u.Assegnazioni)
                      .Include(u => u.AssegnazioniCreate)
                      .Include(u => u.LuoghiCreati)
                      .Include(u => u.AbbonamentiSottoscritti).ThenInclude(x => x.AbbonamentiAccessi).ThenInclude(y => y.Accesso).ThenInclude(z => z.Modulo)
                      .Include(u => u.AbbonamentiCreati).ThenInclude(x => x.AbbonamentiAccessi).ThenInclude(y => y.Accesso).ThenInclude(z => z.Modulo)
                      .SingleOrDefaultAsync(u => u.Id == id);

然后我用foreach获取列表中的数据:

if (utente.AssegnazioniCreate != null && utente.AssegnazioniCreate.Count > 0)
    foreach (var assegnazione in utente.AssegnazioniCreate.AsQueryable().Include(x => x.Luogo).Include(x => x.Utente))
    {
        model.AssegnazioniCreate.Add(new DatiAssegnazioneCreata
        {
            UtenteAssegnato = assegnazione.Utente.Nome ?? assegnazione.Utente.Email,
            Nome = assegnazione.Luogo != null ? assegnazione.Luogo.Nome : "si è verificato un errore",
            Indirizzo = assegnazione.Luogo != null ? assegnazione.Luogo.Indirizzo : "si è verificato un errore",
            AssegnatoIl = assegnazione.CreatoIl
        });
    }

尽管我明确地检查了列表的空值,但是在尝试加载第一个元素时,foreach循环开始并获得NullReference异常。我尝试使用for循环而不是foreach:

if (utente.AssegnazioniCreate != null)
{
    var count = utente.AssegnazioniCreate.Count;
    for (int idx = 0; idx < count; idx++)
    {
        var assegnazione = utente.AssegnazioniCreate[idx];
        model.AssegnazioniCreate.Add(new DatiAssegnazioneCreata
        {
             UtenteAssegnato = assegnazione.Utente.Nome ?? assegnazione.Utente.Email,
             Nome = assegnazione.Luogo != null ? assegnazione.Luogo.Nome : "si    verificato un errore",
             Indirizzo = assegnazione.Luogo != null ? assegnazione.Luogo.Indirizzo : "si    verificato un errore",
             AssegnatoIl = assegnazione.CreatoIl
        });
    }
}

但我还在

An unhandled exception occurred while processing the request.
    NullReferenceException: Object reference not set to an instance of an object.
<{1>} for (int idx = 0; idx < count; idx++)。此外,我无法在本地重现此异常:我的笔记本电脑上的一切正常。

你能给我的每一点帮助都会受到如此多的赞赏。

我附上了异常页面的图片: exception

更新:将每个foreach封装在try-catch之后,我设法避免了异常。因为它甚至告诉我下面有一个NullReferenceException:

DatiAbbonamentoCreato abbonamentoCreato = new DatiAbbonamentoCreato

这些错误实际上可能在某种程度上与实体框架有关吗?

0 个答案:

没有答案