Я использую EF4 и создал объекты POCO.Проблема с объектами POCO заключается в том, что все графы сущностей являются ICollection .... поэтому не могут быть сериализованы.Я решил проблему передачи объекта POCO через WCF.
Проблема заключается в передаче графа сущностей в хранимую процедуру .... поэтому я выбрал способ преобразования графа сущностей в набор данных, преобразованиенабор данных в 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);
}
}