Après la mise à niveau vers DNN 5.5.0, nous avons dû mettre en œuvre IHydratable
sur tous nos objets de gestion.Comment implémenter correctement l'interface IHydratable dans DNN?
Cette idée m'a semblé être un bon début, mais après avoir joué avec IHydratable
je n'en suis plus si sûr.
Il y a deux possibilités:
- Je le fais mal
IHydratable
forces vous d'utiliserselect *
construire une toutes vos requêtes
L'étude de cas:
- Ma première sproc retourne le
BgId
etBgShortDesc
- Ma deuxième retourne sproc
BgId
etBgReportedUser
Mon IHydratable
est mis en œuvre comme indiqué ci-dessous:
public class Bug : IHydratable
{
public int BgId { get; set; }
public string BgShortDesc { get; set; }
public int BgReportedUser { get; set; }
public DateTime BgReportedDate { get; set; }
public Bug() { }
public int KeyID
{
get { return BgId; }
set { BgId = value; }
}
public void Fill(IDataReader dr)
{
BgId = Convert.ToInt32(Null.SetNull(dr["BgId"], BgId));
BgShortDesc = Convert.ToString(Null.SetNull(dr["BgShortDesc"], BgShortDesc));
BgReportedUser = Convert.ToInt32(Null.SetNull(dr["BgReportedUser"], BgReportedUser));
BgReportedDate = Convert.ToDateTime(Null.SetNull(dr["BgReportedDate"], BgReportedDate));
}
}
La méthode de remplissage va jeter un IndexOutOfRangeException
sur l'un des sprocs ci-dessus, car tous les champs ne sont pas retournés avec IDataReader
.
Le moyen le plus simple de contourner le problème est d'utiliser select *
dans tous les sprocs, mais ce n'est pas une bonne pratique.
Quelle est la bonne façon d'implémenter IHydratable
dans ce scénario?
P.S. Gardez à l'esprit que mon exemple est trop simplifié pour faire passer le message.