LINQ to SQL Basic插入抛出:附加或添加不是新实体相关的异常

时间:2009-06-23 12:30:35

标签: 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);
    dc.SubmitChanges();

    CurrentAssessmentId = a2.AssessmentId;
}

代码编译但会在dc.SubmitChanges();行上抛出以下异常。

抛出异常:

  

尝试附加或添加非新的实体,   也许是从另一个DataContext加载的。这不是   支撑。

备注: AssessmentCentreIdtblCentre上的外键,centreId是有效的现有中心ID, AssessmentCentreId和AttemptNumber是唯一的非空字段,其他所有列都允许空值。

我用谷歌搜索但是所有的结果似乎都与试图附加从其他断开连接的DataContext中拉出的实体的人有关,我没有这样做,所以我很难过。

更新

添加

dc.DeferredLoadingEnabled = false;

位于使用区块的顶部使其工作,但我想知道为什么我现在不知道足够先进的技术现在与魔术无法区分:)

3 个答案:

答案 0 :(得分:7)

这也困扰着我。我做了一些搜索,发现了很多关于分离实体的混乱和一些草率的解决方法。 然后我在codeplex上找到了一个很好的解决方案,解决了当前的问题,并大大扩展了linq2sql的功能。它是一个非常容易实现的小类,并为你的项目dbml形成了一个EntityBase。

以下是官方说明和链接。 LINQ to SQL Entity Base是一个简单的基类,主要用于以断开连接的方式支持LINQ to SQL,这是目前LINQ to SQL技术的缺点之一。这在n-Tier,分布式或ASP.NET环境中非常有用,其中断开连接的功能是相关的。

http://linq2sqleb.codeplex.com/

希望这有助于任何有相似之处的人。

杰罗姆·弗农

答案 1 :(得分:4)

问题是上下文中不存在Center对象。它在数据库中,但不是“在你手中”与a2。试试这个:

a2.AssessmentCentre = dc.AssessmentCentres.SingleOrDefault(
    d=>d.AssessmentCentreId.Equals(centreId));

然后,AssessmentCentre对象将存在于上下文中,这意味着将它附加到a2没有问题。

答案 2 :(得分:0)

如果这些是唯一的非空列,那么主键在哪里? LINQ to SQL需要主键来插入数据。如果你自己使用AssessmentCentreId或者将AttemptNumber作为复合使用,你确定你没有尝试插入重复的密钥吗?