WCF RIA服务 - 使用命名更新时出错

时间:2011-11-30 14:53:40

标签: silverlight-4.0 ria wcf-ria-services

我构建了一个非常简单的Silverlight RIA解决方案,在服务器端使用EF4。我向DomainService添加了一个命名更新方法,但我无法使用它。问题出在ChangeSet.GetOriginal()上。它返回null:

    [EnableClientAccess()]
    public class StudentsDomainService : LinqToEntitiesDomainService<Model1Container>
    {
        [Update(UsingCustomMethod = true)]
        public void MyMethod(Student stud, int a, int b)
        {
            stud.FirstName = (a*b).ToString();
            var original = this.ChangeSet.GetOriginal(stud);
            // original is null;
            this.ObjectContext.StudentSet.AttachAsModified(stud, original); //Exception is thrown
        }
        .
        .
        .
     }

这是xaml codebehind:

  
public partial class MainPage : UserControl
    {
        StudentsDomainContext ctx;
        Student stud;

        public MainPage()
        {            
            InitializeComponent();
            ctx = new StudentsDomainContext();
        }

        private void buttonGet_Click(object sender, RoutedEventArgs e)
        {
            ctx.Load<Student>(ctx.GetStudentSetQuery()).Completed += new EventHandler(MainPage_Completed);
        }

        void MainPage_Completed(object sender, EventArgs e)
        {                     
            var lo = (sender as LoadOperation<Student>);
            stud = lo.Entities.First();                    
        }

        private void buttonChange_Click(object sender, RoutedEventArgs e)
        {
            stud.MyMethod(3, 6);                             
            ctx.SubmitChanges();           
        }
    }

重要的是要注意,当我通过自动生成的CRUD使用简单的更新时,一切正常。

1 个答案:

答案 0 :(得分:0)

您的问题的简单答案,您没有更改Silverlight应用程序上的实体,因此没有任何内容发送到服务器,这就是为什么您无法获得原始的一些建议

1.首先,我建议您在Ria Domain服务中使用标准更新功能,它看起来像以下功能。然后在您的客户端,您可以自由更改实体的价值,在您的情况下,您可以更改Silverlight部分的学生姓名。然后将更改一起提交给服务器。

public void UpdateAddress(Address currentAddress)
        {
            this.DbContext.Addresses.AttachAsModified(currentAddress, this.ChangeSet.GetOriginal(currentAddress), this.DbContext);
        }

2.更新操作在最新版本中已过时,已被EntityAction取代。 3.如果您真的想要使用自定义方法,可以尝试使用RoundtripOriginalAttribute,使用此属性注释要将其发送回服务器的所有属性。