Граф сущности Ковнерта в набор данных - PullRequest
0 голосов
/ 01 февраля 2011

Я использую 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);
            }

        }

1 Ответ

0 голосов
/ 01 февраля 2011

Взгляните на этот пост .
Это касается сериализации POCO, надеюсь, это то, что вам нужно.
И этот пост , кажется, решил вашу первоначальную проблему.

...