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的最大缺点