我构建了一个非常简单的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使用简单的更新时,一切正常。
答案 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,使用此属性注释要将其发送回服务器的所有属性。