升级到DNN 5.5.0后,我们必须IHydratable
在所有业务对象上实施。
这个想法一开始似乎是个不错的方法,但玩过之后IHydratable
我就不太确定了。
有两种可能:
- 我做错了
IHydratable
强制您使用select *
构建所有查询
商业案例:
- 我的第一个存储过程返回
BgId
andBgShortDesc
- 我的第二个存储过程返回
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
.
解决该问题的简单方法是select *
在所有存储过程中使用,但这不是一个好习惯。
IHydratable
在这种情况下实施的正确方法是什么?
PS请记住,我的例子过于简单化了。