C# LINQ到SQL基本插入抛出:附加或添加非新实体相关异常
我正在尝试插入一个记录。这个代码有效,但已经停止工作,我不知道为什么。代码如下:C# LINQ到SQL基本插入抛出:附加或添加非新实体相关异常,c#,asp.net,linq-to-sql,C#,Asp.net,Linq To Sql,我正在尝试插入一个记录。这个代码有效,但已经停止工作,我不知道为什么。代码如下: using (SAASDataContext dc = new SAASDataContext()) { tblAssessment a2 = new tblAssessment(); a2.AssessmentCentreId = centreId; a2.AttemptNumber = 1; dc.tblAssessments.InsertOnSubmit(a2);
using (SAASDataContext dc = new SAASDataContext())
{
tblAssessment a2 = new tblAssessment();
a2.AssessmentCentreId = centreId;
a2.AttemptNumber = 1;
dc.tblAssessments.InsertOnSubmit(a2);
dc.SubmitChanges();
CurrentAssessmentId = a2.AssessmentId;
}
代码进行编译,但在dc.SubmitChanges()上抛出下面的异常代码>行
引发异常:
已尝试附加或添加非新实体,
可能是从另一个DataContext加载的。这不是
支持
注意事项:
AssessmentCentreId
是tblCentre
上的外键,centreId是有效的现有中心id,
AssessmentCentreId和AttemptNumber是所有其他列都允许为空的唯一非空字段
我在谷歌上搜索过,但所有结果似乎都与试图连接从其他断开连接的DataContext中提取的实体的人有关。我没有这样做,所以我被难住了
更新:
添加
dc.DeferredLoadingEnabled = false;
在using块的顶部,它可以工作,但我想知道为什么现在我不知道足够先进的技术与magic无法区分:)如果这些是唯一的非空列,主键在哪里?LINQ to SQL需要一个主键来插入数据。如果您单独使用AssessmentCentreId,或者将AttemptNumber作为复合项一起使用,您确定没有尝试插入重复的密钥吗?这也让我感到困扰。我做了一些搜索,发现了很多关于分离实体的混乱和草率的工作然后,我在codeplex上找到了一个很好的解决方案,它解决了眼前的问题,并大大扩展了linq2sql功能。它是一个很容易实现的小类,为您的项目dbml形成了一个EntityBase
这是官方的描述和链接。
linqtosql实体库是一个简单的基类,主要设计用于以断开连接的方式支持linqtosql,这是目前linqtosql技术的缺点之一。这在n层、分布式或ASP.NET环境中非常有用,其中断开连接的功能是相关的
希望这能帮助有类似症状的人
Jerome Vernon问题在于,上下文中不存在中心对象。它在数据库中,但不是a2的“在你手里”。试试这个:
a2.AssessmentCentre = dc.AssessmentCentres.SingleOrDefault(
d=>d.AssessmentCentreId.Equals(centreId));
然后,AssessmentCentre对象将存在于上下文中,这意味着将其附加到a2不会有问题。主键也是非空的,并且是一个自动编号标识(1,1)。为了让我发笑,我给它加上a+1,再加上有同样的问题……这真的很有帮助,处理断开连接的实体是在WCF上使用L2SQL的最大缺点