Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用WCF数据服务保存对象及其相关对象_C#_Entity Framework_Wcf Data Services - Fatal编程技术网

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

C# 使用WCF数据服务保存对象及其相关对象,c#,entity-framework,wcf-data-services,C#,Entity Framework,Wcf Data Services,我使用的是WCF数据服务,它在大多数情况下都能正常工作,但我很难弄清楚如何更新具有相关实体集合的实体。例如,在下面的代码中,我有一个包含相关部门的批处理对象。在我的数据库中,这表示为三个表-批次、部门和批次/部门。EF将其作为具有部门导航属性的批处理对象向我公开 在下面列出的代码中,创建了Batch对象并填充了Departments集合,但当我调用SaveChanges时,数据库中只创建了Batch对象。这些部门被忽视了。如果在SaveChanges行上设置断点,则可以验证是否填充了Depart

我使用的是WCF数据服务,它在大多数情况下都能正常工作,但我很难弄清楚如何更新具有相关实体集合的实体。例如,在下面的代码中,我有一个包含相关部门的批处理对象。在我的数据库中,这表示为三个表-批次、部门和批次/部门。EF将其作为具有部门导航属性的批处理对象向我公开

在下面列出的代码中,创建了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();
}

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

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

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();
}
private void Save()
{
var batches=新的数据服务集合(_ctx);
var batch=new DataService.batch(){Description=txtDescription.Text,Filename=txtdfilename.Text};
批次。添加(批次);
foreach(LST部门中的var部门。CheckedItems)
{
var部门=_ctx.Departments
.选择(d=>d)
.Where(d=>d.DepartmentID==((DataService.Department)Department).DepartmentID)
.First();
批次.部门.添加(部门);
}
//_ctx.AddToBatches(批次);
_ctx.SaveChanges();
}

谢谢您的回复。我之前尝试过这个方法,但是收到一条消息说“上下文当前没有跟踪实体”。因为你的帖子确认了这个方法是正确的,我深入研究了一下,发现我需要在foreach之前移动_ctx.AddToBatchs(批处理)队列。(我之前假设没有跟踪的是dept对象。)完成此操作并在foreach主体中添加AddLink行后,它按照我的预期工作。再次感谢。