2

升级到DNN 5.5.0后,我们必须IHydratable在所有业务对象上实施。

这个想法一开始似乎是个不错的方法,但玩过之后IHydratable我就不太确定了。

有两种可能:

  1. 我做错了
  2. IHydratable强制您使用select *构建所有查询

商业案例:

  • 我的第一个存储过程返回BgIdandBgShortDesc
  • 我的第二个存储过程返回BgIdBgReportedUser

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.

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

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

PS请记住,我的例子过于简单化了。

4

1 回答 1

1

我在另一个论坛上得到了一个可行的答案

这是建议:

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

编辑:

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

    /// <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;
    }
于 2010-10-29T17:16:40.270 回答