如何解决无法附加已经存在的实体
| 每当我尝试更新我的模型之一时,都会收到此错误。更新非常简单:Todo bn = service.GetTodos().Single(t => t.todoId == 1);
bn.Note.noteTitle = \"Something new\";
service.SaveTodo(bn);
这些模型具有以下结构:
待办事项有备注
待办事项具有任务列表
我的服务的SaveTodo看起来像这样:
public void SaveTodo ( TodoWrapper note )
{
using (Repository repo = new Repository(new HpstrDataContext()))
{
if (note != null)
{
Todo todo = repo.Todos.SingleOrDefault(t => t.todoId == note.todoId);
if (todo == null)
{
todo = new Todo();
todo.Note = new Note();
}
todo.dueDate = note.dueDate;
todo.priority = (short)note.priority;
todo.Note.isTrashed = note.Note.isTrashed;
todo.Note.permission = (short)note.Note.permission;
todo.Note.noteTitle = note.Note.noteTitle;
repo.SaveTodo(todo);
}
}
}
Repository \的SaveTodo方法非常简单,看起来像这样:
public void SaveTodo ( Todo todo )
{
if (todo.Note.noteId == 0)
{
dc.NoteTable.InsertOnSubmit(todo.Note);
} else
{
dc.NoteTable.Attach(todo.Note);
dc.NoteTable.Context.Refresh(RefreshMode.KeepCurrentValues,todo.Note);
}
if (todo.todoId == 0)
{
dc.TodoTable.InsertOnSubmit(todo);
} else
{
dc.TodoTable.Attach(todo);
dc.TodoTable.Context.Refresh(RefreshMode.KeepCurrentValues,todo);
}
dc.SubmitChanges();
}
错误在存储库中的此行上抛出:“ 3”。我已经尝试了很多不同的方法来使它起作用,但似乎没有任何效果。
任何帮助将不胜感激
解决方法
所以我(希望)解决了这个问题。在我的存储库中,我将SaveTodo更改为如下形式
public void SaveTodo ( TodoWrapper note )
{
using (Repository repo = new Repository(new HpstrDataContext()))
{
if (note != null)
{
Todo todo = repo.Todos.SingleOrDefault(t => t.todoId == note.todoId);
if (todo == null)
{
todo = new Todo();
todo.Note = new Note();
}
todo.dueDate = note.dueDate;
todo.priority = (short)note.priority;
todo.Note.isTrashed = note.Note.isTrashed;
todo.Note.permission = (short)note.Note.permission;
todo.Note.noteTitle = note.Note.noteTitle;
foreach (TaskWrapper item in note.Tasks)
{
Task t = repo.Tasks.SingleOrDefault(task => task.tasksId == item.taskId);
if (t == null)
{
t = new Task();
}
t.Todo = todo;
t.isCompleted = item.isCompleted;
t.content = item.content;
repo.SaveTask(t);
}
}
}
}
如果有人想知道,包装器将用作带有wcf的实体的包装器(绝不能)。
我的保存任务如下所示:
public void SaveTask ( Task task )
{
if (task.tasksId == 0)
{
dc.TaskTable.InsertOnSubmit(task);
} else
{
dc.TaskTable.Context.Refresh(RefreshMode.KeepCurrentValues,task);
}
dc.SubmitChanges();
}
我摆脱了附加,因为在调用单个或默认语句时,我已经拔出了Todo,因此它已经附加到数据库了。因此错误是正确的,因为此实体已附加到数据库。
如果我创建了一个新的Todo而不是从数据库中获取一个Todo,则附件将起作用。希望这可以帮助那些偶然发现这个问题的人
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。