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

Interface 如何在DNN中正确实现IHydratable接口?,interface,dotnetnuke,dotnetnuke-5,Interface,Dotnetnuke,Dotnetnuke 5,升级到之后,我们必须在所有业务对象上实现IHydratable 起初,这个想法似乎是个不错的选择,但在玩了IHydratable之后,我就不再那么确定了 有两种可能性: 我做错了 IHydratable强制您使用select*构建一个所有查询的 商业案例: 我的第一个存储过程返回BgId和BgShortDesc 我的第二个存储过程返回BgId和bgreepteduser MyIHydratable的实现如下所示: 公共类错误:IHydratable { public int BgId{ge

升级到之后,我们必须在所有业务对象上实现
IHydratable

起初,这个想法似乎是个不错的选择,但在玩了
IHydratable
之后,我就不再那么确定了

有两种可能性:

  • 我做错了
  • IHydratable
    强制您使用
    select*
    构建一个所有查询的
  • 商业案例:

    • 我的第一个存储过程返回
      BgId
      BgShortDesc
    • 我的第二个存储过程返回
      BgId
      bgreepteduser
    My
    IHydratable
    的实现如下所示:

    公共类错误:IHydratable
    { 
    public int BgId{get;set;}
    公共字符串BgShortDesc{get;set;}
    public int BgReportedUser{get;set;}
    公共日期时间BgReportedDate{get;set;}
    公共Bug(){}
    公共整数密钥ID
    {
    获取{return BgId;}
    设置{BgId=value;}
    }
    公共空间填充(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
    返回

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

    在这种情况下,实现
    IHydratable
    的正确方法是什么?


    p.S.请记住,我的例子过于简单化,无法让人明白这一点。

    我在上一篇文章中找到了一个可行的答案

    建议如下:

        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上编写一个扩展方法,找到了更好的方法(和)

    //
    ///在访问列的值之前,请检查列是否存在于datareader中
    /// 
    ///数据阅读器
    ///列名
    ///如果列存在,则为True;如果不存在,则为false
    公共静态bool ColumnExists(此IDataReader读取器,字符串columnName)
    {
    对于(int i=0;i
        /// <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;
        }