我正在使用EF4并创建了POCO对象。 POCO对象的问题是所有实体图都是ICollection ....因此无法序列化。我已经解决了通过WCF传递POCO对象的问题。
问题在于将实体图传递给存储过程....因此我采用的方法是将实体图转换为数据集,将数据集转换为xml,然后将存储过程传递给它....是我在存储过程中获得干净XML的唯一方法。
我正在尝试创建一个通用的辅助方法,将实体图转换为数据集。
public static DataSet ObjectToDataSet<T>(IEnumerable<T> varList)
{
DataSet ds = new DataSet();
if (varList == null)
return ds;
ObjectToDataTable(varList, ds);
return ds;
}
public static void ObjectToDataTable<T>(IEnumerable<T> varlist, DataSet ds)
{
if (varlist == null)
return;
// column names
PropertyInfo[] oProps = null;
string tableName = typeof(T).Name;
bool tableExits = ds.Tables.Contains(tableName);
DataTable dt = new DataTable();
//check if table exits in the dataset
if (!tableExits)
{
dt = new DataTable(typeof(T).Name);
ds.Tables.Add(dt);
oProps = ((Type)varlist.First().GetType()).GetProperties();
foreach (PropertyInfo pi in oProps)
{
Type colType = pi.PropertyType;
if (!colType.IsGenericType)
{
if (colType != typeof(EntityKey))
dt.Columns.Add(new DataColumn(pi.Name, colType));
}
else
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
dt.Columns.Add(new DataColumn(pi.Name, colType.GetGenericArguments()[0]));
else
if (pi.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>))
{
//do nothing
}
}
}
if (tableExits)
dt = ds.Tables[tableName];
foreach (T rec in varlist)
{
DataRow dr = dt.NewRow();
foreach (PropertyInfo pi in oProps)
{
if (pi.PropertyType.Namespace != typeof(System.Collections.Generic.ICollection<>).Namespace)
dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null);
else
{
Type type = pi.PropertyType.GetGenericArguments()[0];
//this would be a recuresive method
//how to get the Type T and the values to pass to method ObjectToDataTable
//need help here
ObjectToDataTable<
}
}
dt.Rows.Add(dr);
}
}