According to the breeze api, when setDeleted is called, it will remove the entity from all the related entities. This is true, but the behavior is flawed when importing a deleted item using the entity manager's importEntities function. The deleted entity will have it's navigational properties emptied, but other entities that have navigational properties containing the deleted item will keep that item in their nav lists. If setDeleted is called on the entity, even though it is already deleted, it will fix the problem, but this should not be necessary.
I've created this test case for the DocCode tests.
/*********************************************************
* Create an EM with parent/child relationship data. Export the EM and import it into a new one, delete the child item in the exported EM
* export the 2nd EM into the first EM.
*********************************************************/
test("test imported deleted nav properties", 2, function () {
var em = newEm();
// create a new parent Customer
var parentCustomer = em.createEntity("Customer", {
CustomerID: dummyCustID,
CompanyName: 'TestCo'
});
// a new Order which is a child of the parent Customer
var newOrder = em.createEntity("Order", {
CustomerID: parentCustomer.CustomerID()
});
parentCustomer.entityAspect.setUnchanged();
newOrder.entityAspect.setUnchanged();
// clone the EM data
var expEntities = em.exportEntities(null, true);
//var newEm = newEm();
var newEM = new breeze.EntityManager();
newEM.importEntities(expEntities, { mergeStrategy: breeze.MergeStrategy.OverwriteChanges });
// delete the order
var newOrderCopy = newEM.getEntities("Order")[0];
newOrderCopy.entityAspect.setDeleted();
// export the cloned EM
var expEntitiesNew = newEM.exportEntities();
// merge to the original EM
em.importEntities(expEntitiesNew, { mergeStrategy: breeze.MergeStrategy.OverwriteChanges });
var deletedOrder = parentCustomer.Orders();
ok(newOrder.entityAspect.entityState.isDeleted(), "newOrder should be 'deleted'");
ok(deletedOrder.length === 0, "parentCustomer's 'Orders' should be empty");
});