LINQ TO SQL错误:已尝试附加或添加非新实体

时间:2009-12-03 16:11:22

标签: c# linq-to-sql datacontext

“已尝试附加或添加非新的实体,可能已从另一个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();

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

如果这样做,外键对象将存在于上下文中,因为您已将其拉出。不要担心性能损失 - 它将被包含在一个简单的SQL语句中。

答案 2 :(得分:0)

什么是“PwrStatus”?如果这是一个Linq2SQL对象,那么通过在aItem中设置引用,将该对象附加到新的datacontext。

EntityFramework肯定会沿着对象树向下移动所有对象到它的上下文。我认为Linq2Sql也做到了。

答案 3 :(得分:0)

  

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

如果执行此操作,那么当您点击SubmitChanges()时,如果出现错误,您将无法删除(撤消)更改。

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

相关问题