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