一个实体,有很多种属性,需要保存实体入数据库。
定义了一个class,但保存的时候不保存的全是class名。查了一下,似乎是需要序列化,想问一下怎么做。
或者用什么其它办法来解决,也想过,把这个实体,变成个xml字段来保存,但同样不知道怎么来做。大家给点实例吧。

解决方案 »

  1.   

    用Linq to sql或者entity,你只需要调两个方法就行了
      

  2.   


    怎么不能保存  什么叫保存的时候不保存的全是class名
      

  3.   

    XmlSerializer http://blog.csdn.net/shizhiyingnj/article/details/1507943
      

  4.   

    去看看orm框架Nhibernate 啊 EF 啊 这些如果就是单单提示XX类需要序列化 你就在类上面加上。[Serializable]
      

  5.   

    这样的,我myclass mycla=new myclass();
    mycla.a=xxx
    mycla.b=xxxsql语句中,string aa="insert into xxx (mycla)values('"+mycla+"')"
    运行状态下,看
    ? aa
    里面看到的values('myclass')这样了。也就是说,注入进去的值,并不是mycla这个对象
      

  6.   

    你臆想天开了...真正的保存对象,并不是直接把内存中的对象简单的拼串SQL语句Insert.是需要把对象序列化,保存为XML,二进制,十六进制机码进数据库
      

  7.   

    我跟#2楼一样,看不懂你写的“但保存的时候不保存的全是class名”这句话。实际上一个实体中真正应该保存起来的是field,而不是property。我觉得可能是linq to sql或者linq to ef的理念有特别独特的地方,但是我仍然它很可能是错误的。道理很简单,property是计算方法,是根据field计算出来的东西然后返回给其它调用它的内存中的程序,同样也是通过计算然后还原为最简单、最真实的field值。所以作为数据库,要保存的是field,而不是property。这也就可以解释一些xml序列化之类的。如果同样的内容既有field、又有propety,那么你可以让序列化机制忽略property。实际上我早年写的ORM系统,就是反射对象的field(不管它是public的还是非public的),然后保存到数据库(当然啦,那个时候还没有属性的{get;set;}这样的语法)。这样当然也可以确保程序中所有读写property都是正确的。我为什么说这么多呢?因为你看似以前亲自做过具体的将对象保存到数据库的处理工作。要知道,当你序列化为xml串或者json串,你有怎么保存到数据库的不同字段中呢?不将一个对象分解到数据库的不同字段中,又怎么索引呢?所以说“xml或者json序列化”其实没有解决这个问题,只不过是换了一个题目而已。如果自己要写ORM操作,就要反射对象的各个字段(或者属性)值。当然,我建议你保存field,而不是property。
      

  8.   


    我这个项目中,属于一个计算类型,一个工程方案,录入的参数有90来个,然后通过参数计算,得出其它结果,而对这些值,确实是不需要在数据库中来操作,这也就是我考虑做为一个实体来存放的原因。对于我前面描述问题的不准确性,也是一时马虎了。后面在五楼,我细化描述了一下,现在在看二楼提供的方法,不过还是很多不理解的地方。。今年三月刚刚开始学的.net,而且也没有系列性的学,都是用到什么就对什么去深入了解。难免会有些很奇怪的问题吧,呵呵。
      

  9.   

    为了说明“只需要向数据库保存该field值,而不需要保存property值”,我给你写一个简单demo(控制台)程序。实际上你也可以从这个程序看出如何搜索对象对应数据库的的各个字段的值。using System;
    using System.Reflection;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main()
            {
                var a = new A { field1 = "小竹", property1 = 1234, property2 = 7890 };
                var b = new A();
                foreach (FieldInfo info in a.GetType().GetFields(System.Reflection.BindingFlags.Instance |
                    System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic))
                {
                    object value = info.GetValue(a);
                    Console.WriteLine("field {0} => {1}", info.Name, info.GetValue(a));
                    info.SetValue(b, value);
                }
                Console.WriteLine();
                Console.WriteLine("b.prperty1={0}, b.2roperty2={1}", b.property1, b.property2);
                Console.ReadKey();
            }        public class A
            {
                public string field1;            public long property1 { get; set; }            private uint _p2;            public uint property2
                {
                    get
                    {
                        return _p2;
                    }
                    set
                    {
                        _p2 = value;
                    }
                }
            }
        }
    }
    运行它,你会发现a中所有private的field都可以自动被反射出值,并且可以正确装到b中,并且b的两个属性返回的值也是正确的。这就说明你无需采集property值,数据库中只需要保存最原始的field值就够了。真实的程序中,不会去向这样每一次采集对象字段值时去反射。只需要反射一次,然后把FieldInfo集合存起来反复使用就可以了。真实的ORM程序,根据你的目标数据库的不同,你自己翻译为原生数据的操作。例如翻译为SQL Server的t-sql语句。那是你自己的设计事情。这个程序只是告诉你如何反射对象的有用信息(然后你就可以把各个字段的value写入数据库),并且如何把(从数据库中读出的每个字段的value)信息再写到对象中。
    实际上设计一个ORM可能还涉及到当一个对象的field是引用另外类型时,如何映射到数据库的外键关联的其它表中。以及自动处理对象唯一ID(例如你可以判断对象是否有一个你自定义的 IRequireIDField接口,如果有你就可以在insert时为它自动填写ID)。对于关系数据库,还要自动通过反射的FieldInfo来自动创建数据库表,通过反射Field上的Attribute标签来自动创建索引。编程时经常会扩展class定义,所以当用户新增了字段,你的程序第一次反射一个类型时就可以自动去更新数据库定义,增加新的字段以及默认值。当遇到一个field是引用类型时,还要自动创建关联子表,并且自动创建外键。等等。不过你在问题中都没有问及这些。实际上假设你仅仅使用非常简单类型的字段定义,那么能够简单地反射field、GetValue和SetValue,这是最基本的知识了。