使用WCF数据服务保存对象及其相关对象

时间:2012-07-03 14:48:12

标签: c# entity-framework wcf-data-services

我正在使用适用于大多数事情的WCF数据服务,但我无法确定如何更新具有相关实体集合的实体。例如,在下面的代码中,我有一个Batch对象,它有相关的Departments。在我的数据库中,这表示为三个表 - 批次,部门和批次_部门。 EF将此公开为具有Departments导航属性的Batch对象。

在下面列出的代码中,创建了Batch对象并填充了Departments集合,但是当我调用SaveChanges时,只在数据库中创建了Batch对象。部门被忽略了。如果我在SaveChanges行上设置断点,我可以验证是否填充了Departments集合。

private void Save()
{
  var batch = new DataService.Batch() { Description = txtDescription.Text, Filename = txtFilename.Text };

  foreach (var department in lstDepartments.CheckedItems)
  {
    var dept = _ctx.Departments
      .Select(d => d)
      .Where(d => d.DepartmentID == ((DataService.Department)department).DepartmentID)
      .First();

    batch.Departments.Add(dept);
  }

  _ctx.AddToBatches(batch);
  _ctx.SaveChanges();
}

我确定我错过了一些明显的东西,但我似乎无法找到它。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是当前生成的代码中的限制。您还需要在程序中添加以下代码行:

context.AddLink(batch, "Departments", dept);

如果您愿意,也可以挂钩PropertyChanged事件。

编辑:我也找到了另一个选项。您可以执行以下操作,而不是AddLink

private void Save()
{
  var batches = new DataServiceCollection<Batch>(_ctx);
  var batch = new DataService.Batch() { Description = txtDescription.Text, Filename = txtFilename.Text };
  batches.Add(batch);

  foreach (var department in lstDepartments.CheckedItems)
  {
    var dept = _ctx.Departments
      .Select(d => d)
      .Where(d => d.DepartmentID == ((DataService.Department)department).DepartmentID)
      .First();

    batch.Departments.Add(dept);
  }

  // _ctx.AddToBatches(batch);
  _ctx.SaveChanges();
}