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

Bla*_*rel 12 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;
}
Run Code Online (Sandbox Code Playgroud)

代码编译但dc.SubmitChanges();在行下面抛出异常.

抛出异常:

已尝试附加或添加非新的实体,可能已从另一个DataContext加载.这不受支持.

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

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

更新:

添加

dc.DeferredLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

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

http://linq2sqleb.codeplex.com/

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

杰罗姆弗农


bai*_*yrt 4

问题是 Center 对象在上下文中不存在。它在 db 中,但不在 a2 的“手中”。尝试这个:

a2.AssessmentCentre = dc.AssessmentCentres.SingleOrDefault(
    d=>d.AssessmentCentreId.Equals(centreId));
Run Code Online (Sandbox Code Playgroud)

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