【问题标题】:LINQ TO SQL error: An attempt has been made to Attach or Add an entity that is not newLINQ TO SQL 错误:已尝试附加或添加不是新的实体
【发布时间】:2009-12-03 16:11:21
【问题描述】:

“已尝试附加或添加一个不是新的实体,可能是从另一个 DataContext 加载的。不支持。”

我有很多处理 Attach() 方法的解决方案,但我只是想添加一条新记录。不知道发生了什么。

这是我的代码,它在加星号的行上失败了。:

try
            {
                LINQDataContext datacontext = new LINQDataContext();


                TrackableItem ti = datacontext.TrackableItems.FirstOrDefault(_t => _t.pkId == obj.fkTrackableItemId);
                arcTrackableItem ati = new arcTrackableItem();
                ati.barcode = ti.barcode;
                ati.dashNumber = ti.dashNumber;
                ati.dateDown = ti.dateDown;
                ati.dateUp = ti.dateUp;
                ati.fkItemStatusId = ti.fkItemStatusId;
                ati.fkItemTypeId = ti.fkItemTypeId;
                ati.partNumber = ti.partNumber;
                ati.serialNumber = ti.serialNumber;
                ati.archiveDate = DateTime.Now;

                datacontext.arcTrackableItems.InsertOnSubmit(ati);
                datacontext.SubmitChanges();


                arcPWR aItem = new arcPWR();
                aItem.comments = obj.comments;
                aItem.fkTrackableItemId = ati.pkId;
                aItem.fkPWRStatusId = obj.fkPWRStatusId;
                aItem.PwrStatus = obj.PwrStatus;


                **datacontext.arcPWRs.InsertOnSubmit(aItem);**
                datacontext.SubmitChanges();

【问题讨论】:

    标签: c# linq-to-sql datacontext


    【解决方案1】:

    看起来obj 是使用不同的 dataContext 构建的,并且需要使用相同的 dataContext 创建而不是实例化一个新的。

    一个快速的解决方案可能是传入一个 dataContext 而不是在这个方法中实例化一个新的。

    【讨论】:

      【解决方案2】:

      表示外键的字段(例如ati.fkItemStatusId = ti.fkItemStatusId)需要存在于当前上下文中。试试这样的:

      ati.fkItemStatus = dataContext.ItemStatuses.SingleOrDefault(
          d=>d.ItemStatus.ItemStatusId.Equals(ti.fkItemStatusId);
      

      如果你这样做,外键对象将存在于上下文中,因为你将拉取它。不用担心性能下降 - 它会被封装到一个简单的 SQL 语句中。

      【讨论】:

        【解决方案3】:

        什么是“PwrStatus”?如果这是一个 Linq2SQL 对象,那么您可以通过在 aItem 中设置一个引用将该对象附加到您的新数据上下文中。

        EntityFramework 确实会沿着您的对象树向下移动,并将所有对象附加到它的上下文中。我认为 Linq2Sql 也可以。

        【讨论】:

          【解决方案4】:

          一个快速的解决方案可能是传入一个 dataContext 而不是在这个方法中实例化一个新的

          如果您这样做,那么您将无法删除(撤消)更改,以防在您点击 SubmitChanges() 时引发错误。

          您可以手动设置任何关系的外键并立即调用 SubmitChanges。 如果关系已经定义了外键,那么您将收到错误并需要分配对象。在你的情况下 ati.ItemStatus = newItemStatus。但在这种情况下,您需要保存在相同的数据上下文中,这不会让您撤消更改。 :(

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多