2

我正在使用 WCF 数据服务,它适用于大多数事情,但我无法弄清楚如何更新具有相关实体集合的实体。例如,在下面的代码中,我有一个具有相关部门的 Batch 对象。在我的数据库中,这表示为三个表 - Batches、Departments 和 Batches_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();
}

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

4

1 回答 1

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();
}
于 2012-07-03T16:41:21.943 回答