将实体图转换为数据集

时间:2011-01-31 23:38:47

标签: entity-framework-4 dataset entity poco

我正在使用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);
            }

        }

1 个答案:

答案 0 :(得分:0)

看看this post 它处理POCO序列化,希望这是你需要的。
this post似乎可以解决您的初始问题。