我正在使用 WCF 数据服务,它适用于大多数事情,但我在弄清楚如何更新具有相关实体集合的实体时遇到了麻烦。 例如,在下面的代码中,我有一个具有相关部门的 Batch 对象。 在我的数据库中,这表示为三个表 - 批次、部门和Batches_Departments。 EF 将其作为具有部门导航属性的批处理对象向我公开。
在下面列出的代码中,将创建 Batch 对象并填充 Departments 集合,但是当我调用 SaveChanges 时,只会在数据库中创建 Batch 对象。 部门被忽略。 如果在"保存更改"行上设置断点,则可以验证是否已填充"部门"集合。
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();
}