我正在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++)
。此外,我无法在本地重现此异常:我的笔记本电脑上的一切正常。
你能给我的每一点帮助都会受到如此多的赞赏。
更新:将每个foreach封装在try-catch
之后,我设法避免了异常。因为它甚至告诉我下面有一个NullReferenceException:
DatiAbbonamentoCreato abbonamentoCreato = new DatiAbbonamentoCreato
这些错误实际上可能在某种程度上与实体框架有关吗?