代码之家  ›  专栏  ›  技术社区  ›  roman m

如何在DNN中正确实现IHydratable接口?

  •  2
  • roman m  · 技术社区  · 14 年前

    DNN 5.5.0 我们必须实施 IHydratable 在我们所有的业务对象上。

    这个想法一开始似乎是个不错的选择,但在玩过之后 IHydratable公司

    有两种可能:

    1. 我做错了
    2. IHydratable公司 强迫你使用 select *

    • BgId BgShortDesc
    • 我的第二次狂欢又回来了 BgId编号 BgReportedUser

    我的 IHydratable公司

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

    fill方法将抛出 IndexOutOfRangeException 在上述存储过程中,由于不是所有字段都返回 IDataReader .

    解决这个问题的简单方法是使用 选择* 在所有的存储过程中,但这不是一个好的做法。

    正确的实施方法是什么 IHydratable公司 在这种情况下?

    附笔。 请记住,我的例子过于简单化了,无法理解这一点。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Community rohancragg    7 年前

    我在网上找到了一个可行的答案 another forum

    建议如下:

        public void Fill(IDataReader dr)
        {
                if (dr.ColumnExists("BgId"))
                {
                  BgId = Convert.ToInt32(Null.SetNull(dr["BgId"], BgId));
                }
                //do the above for all the properties
        }
    

    通过在IDataReader上编写一个扩展方法,并借助以下两个答案,找到了更好的方法( @JamesEggers @Chad Grant )

        /// <summary>
        /// Check if the column exists in the datareader before accessing its value
        /// </summary>
        /// <param name="reader">DataReader</param>
        /// <param name="columnName">Column name</param>
        /// <returns>True if column exists, false if not</returns>
        public static bool ColumnExists(this IDataReader reader, string columnName)
        {
            for (int i = 0; i < reader.FieldCount; i++)
            {
                if (reader.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
                {
                    return true;
                }
            }
    
            return false;
        }