Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# 实体框架向数据库添加新行时引发异常_C#_.net_Asp.net_Entity Framework - Fatal编程技术网

C# 实体框架向数据库添加新行时引发异常

C# 实体框架向数据库添加新行时引发异常,c#,.net,asp.net,entity-framework,C#,.net,Asp.net,Entity Framework,我已经尝试了一段时间来调试它,并用不同的方式表达我想要做的事情,但是我没有运气。我对实体框架不太了解,我从另一个不再在身边的开发人员那里继承了这段代码,所以我对模型不太了解。也许至少有人能给我指出正确的方向。这是我的密码: //Append note to project notes too task.TPM_PROJECTVERSIONReference.Load(); TPM_PROJECTVERSIONNOTES newNote = new TPM_PROJECTVERSIONNOTES(

我已经尝试了一段时间来调试它,并用不同的方式表达我想要做的事情,但是我没有运气。我对实体框架不太了解,我从另一个不再在身边的开发人员那里继承了这段代码,所以我对模型不太了解。也许至少有人能给我指出正确的方向。这是我的密码:

//Append note to project notes too
task.TPM_PROJECTVERSIONReference.Load();
TPM_PROJECTVERSIONNOTES newNote = new TPM_PROJECTVERSIONNOTES();
newNote.TS = System.DateTime.Now;
newNote.TPM_USER = SessionHandler.LoginUser;
newNote.NOTES = task.NOTES;
newNote.PROJECTID = this.ProjectId;
newNote.VERSIONID = this.VersionId;
task.TPM_PROJECTVERSION.TPM_PROJECTVERSIONNOTES.Add(newNote); //<-- Exception
尽管如此,我还是得到了同样的例外:

System.InvalidOperationException was unhandled by user code
  Message=The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.
  Source=System.Data.Entity

我就是不明白为什么会有两种情况?我在代码中的每个地方都使用“上下文”。实体框架怎么会使简单地向数据库中添加一行变得如此困难?

尝试将Web.Config连接字符串设置为包含MultipleActiveResultSets=True。

Welp在尝试了近4个小时后,我真正能够使用的唯一解决方案就是这个。显然,将新数据插入数据库是实体框架的一项高级功能,需要深入了解其内部工作原理

context.ExecuteStoreQuery<object>("INSERT INTO TPM_PROJECTVERSIONNOTES (NOTES, PROJECTID, VERSIONID, USERID, TS) VALUES (:notes, :projId, :versionId, :userId, :timestamp)",
   new OracleParameter("notes", this.txtTaskNotes.Text),
   new OracleParameter("projId", this.ProjectId),
   new OracleParameter("versionId", this.VersionId),
   new OracleParameter("userId", SessionHandler.LoginUser.USERID),
   new OracleParameter("timestamp", DateTime.Now));
context.ExecuteStoreQuery(“插入TPM_项目版本注释(注释,项目ID,版本ID,用户ID,TS)值(:NOTES,:projId,:VERSIONID,:USERID,:timestamp)”,
新的OracleParameter(“notes”,this.txtTaskNotes.Text),
新的OracleParameter(“projId”,this.projectd),
新的OracleParameter(“versionId”,this.versionId),
新的OracleParameter(“userId”,SessionHandler.logiuser.userId),
新的OracleParameter(“timestamp”,DateTime.Now));
哦,好吧,至少速度很快。

问题出在

newNote.TPM_USER = SessionHandler.LoginUser;
LoginUser
是使用另一个上下文创建的。您正在将其附加到
上下文
。有两种方法可以解决这个问题

登录用户
与其创建的上下文分离

sessionContext.Detach(SessionHandler.LoginUser);
然后在你的方法里面

using (TPMEntities context = new TPMEntities(General.EntityName()))
{
   context.Attach(SessionHandler.LoginUser);

   TPM_PROJECTVERSIONNOTES newNote = context.TPM_PROJECTVERSIONNOTES.CreateObject();
   newNote.TS = System.DateTime.Now;
   newNote.TPM_USER = SessionHandler.LoginUser;
   newNote.NOTES = this.txtTaskNotes.Text;
   TPM_PROJECTVERSION version = (from pv in context.TPM_PROJECTVERSION
                                 where pv.PROJECTID == this.ProjectId && pv.VERSIONID == this.VersionId
                                 select pv).First();

   version.TPM_PROJECTVERSIONNOTES.Add(newNote);
   context.SaveChanges();
}
或者如果已映射标量外键属性
newNote.TPM\u USER\u ID

using (TPMEntities context = new TPMEntities(General.EntityName()))
{
   TPM_PROJECTVERSIONNOTES newNote = context.TPM_PROJECTVERSIONNOTES.CreateObject();
   newNote.TS = System.DateTime.Now;
   newNote.TPM_USER_ID = SessionHandler.LoginUser.ID;
   newNote.NOTES = this.txtTaskNotes.Text;
   TPM_PROJECTVERSION version = (from pv in context.TPM_PROJECTVERSION
                                 where pv.PROJECTID == this.ProjectId && pv.VERSIONID == this.VersionId
                                 select pv).First();

   version.TPM_PROJECTVERSIONNOTES.Add(newNote);
   context.SaveChanges();
}

那么你的理由是什么?这是因为我正在用“任务”进行大量编辑,而不能同时向其中添加新的关系吗?啊……不使用MS SQL。我有一个类似的问题,并使改变修复它。不确定EF是如何处理DB事务的,但我知道它必须处理多个结果集才能保持其OO方法。我通常将DB上下文作为模块级变量加载,并在整个类中使用它,这样我就不会遇到多个上下文对象的问题。(注意:有时需要多个上下文)。是的,此代码发生在创建上下文的using()块中。有/应该/只有一个上下文..“task”是在using()块的内部、外部定义的还是作为参数定义的?不完全是。任务是在using块中声明的,但我们使用一个函数加载它:Task=TaskManager.GetTaskIfExists(context,this.TaskId);--但是,该函数使用相同的上下文并使用LINQ查询从数据库加载TPM_任务对象。既然上下文被传入了,那应该没问题吧?
using (TPMEntities context = new TPMEntities(General.EntityName()))
{
   TPM_PROJECTVERSIONNOTES newNote = context.TPM_PROJECTVERSIONNOTES.CreateObject();
   newNote.TS = System.DateTime.Now;
   newNote.TPM_USER_ID = SessionHandler.LoginUser.ID;
   newNote.NOTES = this.txtTaskNotes.Text;
   TPM_PROJECTVERSION version = (from pv in context.TPM_PROJECTVERSION
                                 where pv.PROJECTID == this.ProjectId && pv.VERSIONID == this.VersionId
                                 select pv).First();

   version.TPM_PROJECTVERSIONNOTES.Add(newNote);
   context.SaveChanges();
}