我在这里看到的一些帖子看起来像我的,但是找不到我特定问题的答案。
问题是我正在尝试使用导航将实体插入数据库。支柱。
但是我经常得到:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
using (EntitiesDatabase context = new EntitiesDatabase())
{
if (UserHandler.Instance.User is Admin)
{
((Admin)UserHandler.Instance.User).ProjectManagers.Add(
new ProjectManager(firstNameTextBox.Text, lastNameTextBox.Text, usernameTextBox.Text, passwordTextBox.Text));
}
else if (UserHandler.Instance.User is ProjectManager)
{
((ProjectManager)UserHandler.Instance.User).Developers.Add(
new Developer(firstNameTextBox.Text, lastNameTextBox.Text, usernameTextBox.Text, passwordTextBox.Text));
}
context.SaveChanges();
}
错误异常在代码(u.ProjectManagers.Add(new ProjectManager(...))
为清晰起见:
UserHandler
是一个singelton,它保存对登录用户的引用。
用户具有导航属性
public virtual ICollection<ProjectManager> ProjectManagers { get; set; }
在我对上下文SaveChanges()
进行using
之后,实际上应该将新项目管理器插入到数据库中。
我已经对较小的项目进行了一些简单的测试(比如PluralSight教程中的那些)并且它确实有效...由于某些原因,这些相同的行不起作用。 在我尝试将其插入导航器之前,似乎我正在创建的新项目经理似乎正在处理。支柱。因为我从来没有进入保存更改行......
从我看过的其他答案中,我猜测{{1}}语句出于某种原因在事物到达最后一步之前将其处理掉。我不明白为什么...... 有人能以正确的方式指出我吗?
BTW这不是家庭作业的人,这是我的一个项目,我正在努力学习C#,EF和其他技术。答案 0 :(得分:0)
我的猜测是,与UserHandler.Instance.User
相关的数据上下文在当前调用上下文中不存在,并且UserHandler.Instance.User
未附加到最近实例化的context
。 / p>
答案 1 :(得分:0)
看起来你得到User
实例的上下文是在不同的上下文中获取的,这些上下文被处理掉了。
您有两个选项可以使用相同的上下文,也可以使用ObjectContext.Attach将实体附加到新上下文中,如下所示:
using (EntitiesDatabase context = new EntitiesDatabase())
{
context.Attach(UserHandler.Instance.User);
if (UserHandler.Instance.User is Admin)
{
((Admin)UserHandler.Instance.User).ProjectManagers.Add(
new ProjectManager(firstNameTextBox.Text, lastNameTextBox.Text, usernameTextBox.Text, passwordTextBox.Text));
}
else if (UserHandler.Instance.User is ProjectManager)
{
((ProjectManager)UserHandler.Instance.User).Developers.Add(
new Developer(firstNameTextBox.Text, lastNameTextBox.Text, usernameTextBox.Text, passwordTextBox.Text));
}
context.SaveChanges();
}