“已尝试附加或添加非新的实体,可能已从另一个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();
答案 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。但在这种情况下,您需要保存在相同的数据上下文中,这不会让您撤消更改。 :(