Vibrant discussion about CSLA .NET and using the framework to build great business applications.
Hi all I'm having this problem, and after search on google, found it quite common:
- first, delete a row from a table, or update a specific field (related to unique index)- then, add new row with same value
example: delete order row item #2 (fieldXYZ=2),then add new row item with same value (fieldXYZ=2),plus there is a unique index on fieldXYZ
what I noticed is:
- csla business list tells EF what to do in the right sequence: first delete child object, then insert newchild object
- EF does insert operation before delete, so database index raise error "Cannot insert duplicate key row in object '[....]' with unique index 'IX_[...]'.The statement has been terminated." and I get an exception.
Found same error in these threads "Getting Insert Duplicate Key Error But Only Updating and Deleting", "Get duplicate key exception when deleting and then re-adding child rows with Entity Framework".
I found a solution that seems working good, but I'm not sure it is the right one:
Here is my code, fix in "SaveChanges(false)" in child snippet :
- root object code is similar to this:
[Transactional(TransactionalTypes.TransactionScope)] protected override void DataPortal_Update() { using (ObjectContextManager<MyEntities> manager = ObjectContextManager<MyEntities>.GetManager(MyConnectionName, true)) { // do some stuff here // ... update order header, if necessary // update child objects, order items DataPortal.UpdateChild(ReadProperty(OtherItemListProperty), this, order); manager.ObjectContext.SaveChanges(); } FieldManager.UpdateChildren(); }
- child object code is similar to this:
private void Child_Insert(Order o, Order orderEF) { using (ObjectContextManager<MyEntities> manager = ObjectContextManager<MyEntities>.GetManager(MyConnectionName, true)) { OrderItem orderItemEF = manager.ObjectContext.OrderItems.Where("it.fieldXYZ = 4").FirstOrDefault(); // ... orderItemEF set fields orderItemEF.FieldXYZ = 2; // unique index on this field manager.ObjectContext.AddToOrderItems(orderItemEF); // manager.ObjectContext.SaveChanges(false); // WITHOUT THIS, ERROR RAISED ON UNIQUE INDEX } FieldManager.UpdateChildren(); }
Is it the right solution? or are there better ones ?
ps: in this project, EF is 1.0; should (have) I update to 4.0 ?I would like not to, because I have third part libraries not updated to fw 4.0 .
thank you very much