我有两个班..
class Assembly
{
public Assembly()
{
this.Tasks = new List<Task>();
}
public int AssemblyId { get; set; }
public string PartNum { get; set; }
public string Desc { get; set; }
public List<Task> Tasks { get; set; }
}
和
class Task
{
public int TaskId { get; set; }
public string Name { get; set; }
public string Desc { get; set; }
public int workMins { get; set; }
public List<Assembly> Assemblies { get; set; }
}
这些类设置为具有多对多关系。
我有一个已保存到数据库的任务列表,我正在尝试将其中一个任务添加到新程序集中。
我正在讨论的问题是当我尝试使用任务创建新程序集并将其保存到数据库时。
using (CapacityContext ctx = new CapacityContext())
{
Assembly a = new Assembly();
a.PartNum = cmbPartNum.Text;
a.Desc = txtDesc.Text;
foreach (DataGridViewRow dr in gridTasks.Rows)
{
int taskId = Convert.ToInt16(dr.Cells[colTaskId.Name].Value);
Task at = Task.GetTaskById(taskId);
a.Tasks.Add(at);
}
ctx.Assemblies.Add(a);
ctx.SaveChanges();
}
一旦将更改发送到数据库,就会向Tasks表插入一个新的Task,除了它有一个新的TaskId之外。我在保存之前检查了权利,并添加了正确taskId的正确任务,所以我对我做错了什么感到茫然。
修改 对于碰到这个的其他人,我发现了问题。我创建了这个方法
public static Task GetTaskById(int id)
{
using (CapacityContext ctx = new CapacityContext())
{
try
{
return ctx.Tasks.Find(id);
}
catch (InvalidOperationException)
{
return null;
}
}
}
通过其ID检索taks。这就是问题的原因,因为从不同的上下文中使用Find()插入一个权限是禁止的。一旦我将ctx.Tasks.Find(id);
移动到创建程序集的相同方法中,它就可以正常工作!