我找到的每篇文章都展示了如何使用RIA添加新项目。没有人更新现有数据吗?肯定看起来不像。
情景:
我正在使用来自我的VM的服务来提取我的实体。然后使用我的视图中的VM编辑实体。然后我想将我的实体保存回数据库。我不想添加它。我不想删除它。我想更新它。我在服务器端看到了相应的方法,但我所拥有的只是在我的datacontext上提交更改。
我试图克隆原始实体,然后附加原始实体并将当前实体复制到其上
public void SaveDoctors(Doctors current, Doctors original, Action<SubmitOperation> callback)
{
var ctx = new RefereeDomainContext();
ctx.Doctors.Attach(original);
original = current;
ctx.SubmitChanges(callback,null);
}
这也不起作用。我今天已经浏览了10个博客,我发现的任何内容都是关于添加新实体,即使他们声称他们会告诉你如何更新实体。
我可以轻松地将实体发送到服务器端并在那里执行,但我不知道这是正确的形式。
更新实体的适当位置在哪里?我正在使用SL5,我不知道如何告诉你我正在使用的RIA服务版本。
澄清
我使用来自viewmodel的服务调用来检索我的实体:
Doctors doctors = GetService<IDoctors>.GetDoctor().FirstorDefault(d=>d.id=xxxx);
我将医生实体推入我的VM结构中:
DoctorsVM=new DoctorsVM(doctors);
这包含通过视图模型的属性编辑的医生的参考。任何子项都填充到子对象的ObservableCollections中。
当我完成这个特定的实体并且我准备保存它时:
GetService.UpdateCurrentDoctor(DoctorsVM.Doctor)//引用原始实体。
这是我失去它的地方。如果我这样做:在我的方法内部它不起作用
var ctx=new DataContext;
ctx.Attach(currentDoctor);//attaches as unmodified
ctx.Add(currentDoctor);//creates a new Entity. Dont want that.
ctx.AttachAsModified仅在服务器端可用。 ctx.UpdateDoctors仅在服务器端可用。
这是我迷路的地方。
我来自WPF /桌面背景,所以也许我只是迷失在整个异步环境中。我只需要朝着正确的方向努力。
答案 0 :(得分:0)
问题有点长,所以答案可能有点长:)
如果你确实需要,你不应该克隆实体!
背景 在实体模型中,我们为每个实体提供密钥。如果检查域服务,您将看到此键属性完成的所有CRUD操作。如果从服务器端返回一个集合,则两个实体具有相同的密钥,您将在客户端看到其中一个。
答案 它很容易更新记录。只需使用DomainService类实例获取实体获取要修改的项目,然后提交它。就是这样。
//a line of unsafe-dummy code
domService.GetDoctorByID("124..").FirstOrDefault().CitizenNumber='CN123';
//domService class track changeset so it decide update
domService.SubmitChanges();
//Update occurs by entity key i.e. DoctorID
我看到“医生”表达我们还使用silverlight&amp; amp; ria服务。祝你好运!
答案 1 :(得分:0)
看来你必须在一个会话期间保持datacontext的活动状态。我不喜欢这样,但它就是这样。我正在从应用程序的下一次搜索重置domaincontext,以便它不会变得非常庞大。