none
在用RIA开发时怎么把一个实体对象传到服务器 RRS feed

  • 问题

  • 我在服务器用实体框架映射了数据库中的Payment 表,然后在DomainService中设置了Payment 类为Enable editing,在程序运作时在客户端实例化了这个对象(Payment),然后想把这个对象回传到服务器端进行一些操作,但是程序编译就报错。

    下面是我的代码节选

    namespace IPPG.Web
    {
        public partial class IPPGDomainService
        {
            public Payment SavePayment(Payment payment)
            {
                payment.PaymentID = Guid.NewGuid();

                ...其他代码...
                return payment;
            }
        }
    }

    出现这个错误

    错误 1 Parameter 'payment' of domain operation entry 'SavePayment' must be one of the predefined serializable types. IPPG

     

    PS:2010-10-19修改了问题,让问题描述更加准确

    • 已编辑 超然 2010年10月19日 4:41 更加准确的表述问题
    2010年10月17日 4:57

答案

全部回复

  • 在服务器端的WebService或者WCF里面声明这个Payment 类
    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2010年10月17日 14:26
    版主
  • 如果你愿意采用TFSoft个人研制的T4Data系列,你永远也不需要在SL或服务器端建立数据实体类。T4Data系列可以在SL或服务器间直接传输,而且不需要你自己做系列化,支持.net的基本数据类型。
    2010年10月17日 16:05
  • 在服务器端的WebService或者WCF里面声明这个Payment 类
    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    Payment 类在创建实体框架时已经创建了,在DomainService里又扩充了一下,说以这个类我肯定是有的
    2010年10月19日 4:36
  • 如果你愿意采用TFSoft个人研制的T4Data系列,你永远也不需要在SL或服务器端建立数据实体类。T4Data系列可以在SL或服务器间直接传输,而且不需要你自己做系列化,支持.net的基本数据类型。
    目前正在学习中,基础还没有打好,所以不想用用第三方的,等学的差不多了再用你的
    2010年10月19日 4:37
  • 不用关心如何传到服务端,domain会自己处理。

    domain.实体.add(new 实体());

    domain.SubmitChanges();

    这样应该就可以了。

    2010年10月19日 7:24
  • 不用关心如何传到服务端,domain会自己处理。

    domain.实体.add(new 实体());

    domain.SubmitChanges();

    这样应该就可以了。


    添加实体保存什么我都行,问题我不是要添加,举个例子把,比如我填写了一张出货单,某样东西出货了10件,我保存了出货单记录,这时我就需要修改库存数量,所以我需要调用domain那里的一个方法,而这个方法必须要有一个参数是货物的对象,应为我有了修改的对象后,我就可以到数据库中做响应的修改了。

    现在问题是domain函数参数如果是一个对象的话就出现我一楼说的问题。很诡异啊。

    2010年10月19日 7:43
  • 你好,

    对象需要从服务器端查询获得。如果你现在已经有这个对象,但是不在domaincontext的缓存里,你可以调用domiancontext.[entity name here].Attach() 方法来把它加入缓存。

    谢谢


    Mog Liang
    2010年10月20日 8:39
  • 你没有理解我的意思,我把我的测试代码全部贴出来,大家帮我看看怎么回事啊,超级郁闷中

    //客户端控件代码

        public partial class MainPage : UserControl
        {
            ABC a;
            SilverlightApplication5.Web.DomainService1 ds = new Web.DomainService1();
            public MainPage()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, RoutedEventArgs e)
            {

                ds.Load(ds.NewABCQuery(), CCC, null);//调用服务器代码获得对象、如果这里我直接在客户端创建,同样有问题
            }

            public void CCC(LoadOperation<Web.ABC> lo)
            {
                a = lo.Entities.First();//获得了对象,把对象记录下来

            }

            private void button2_Click(object sender, RoutedEventArgs e)
            {

                a.C=9;//随便赋值
                ds.SaveABC(a);//调用服务器代码进行保存操作(这里的保存失效了)
            }
        }

    服务代码

            public ABC NewABC()
            {
                return this.ObjectContext.ABC.CreateObject();//对应button1代码,返回一个对象

            }

            public void SaveABC(ABC abc)//对应button2进行保存,程序没有任何效果
            {
                abc.B = 11;//因为有些值只有服务器有,所以我必须要在服务器赋值。
                this.ObjectContext.ABC.Attach(abc);
                this.ObjectContext.SaveChanges();
            }

    2010年10月21日 7:47
  • http://funsl.com/riaService

    希望以上教程能对你有所帮助!


    • 已标记为答案 Mog Liang 2010年11月8日 2:37
    2010年10月27日 19:42
    版主
  • http://funsl.com/riaService

    希望以上教程能对你有所帮助!

    你的文章写的很好,对我很有帮助,我这个问题就是管你文章中“.net ria services 自定义函数(9)”涉及到的,你的自定义参数类型是string,而我要实现的事自定义函数参数是一个实体对象。
    2010年10月30日 6:46
  • 问题还没有解决?

    private void button2_Click(object sender, RoutedEventArgs e)
            {             a.C=9;//随便赋值
                ds.SaveABC(a);//调用服务器代码进行保存操作(这里的保存失效了)
            }

    改成:

    private void button2_Click(object sender, RoutedEventArgs e)
            {           

    ds.SaveChanges();\\即可
            }

    服务端代码(不要,去掉)

    public void SaveABC(ABC abc)//对应button2进行保存,程序没有任何效果
            {
                abc.B = 11;//因为有些值只有服务器有,所以我必须要在服务器赋值。
                this.ObjectContext.ABC.Attach(abc);
                this.ObjectContext.SaveChanges();
            }

     

     

     

    2010年11月2日 7:02
  • 你可以直接多定义一个自定义的数据结构类,例如下例:

    public class myclass

     {
       [Key]
       public string userid { get; set; }
       public ndata nndata { get; set; }
     }
    public class ndata
    {
     public int age{get;set;}
     public bool state{get;set}
    }


    2010年11月17日 19:24
    版主
  • 呵呵....请问一下 TFSoft 你的T4Data 可以开源吗?

    我倒是想用你的技术


    Andy
    2011年3月21日 7:28
  • 可以考虑开源。如果你不需要我提供任何服务。

    但是我的类库,里面的东西还是蛮多的。可能你需要我提供服务,那么就需要你给点小费。

    QQ:342401768(我经常不在线,你得约定时间。)

    2011年3月22日 4:26