How to Check for Session Changes
-
The Session tracks all changes made to all the entities it has either loaded, stored, deleted, or queried for,
and persists to the server only what is needed whensaveChanges()
is called. -
This article describes how to check for changes made to all tracked entities within the session.
To check for changes to a specific entity, see Check for entity changes. -
To get the list of all entities tracked by the session, see Get tracked entities.
-
In this page:
Check for session changes
-
The session's advanced property
hasChanges
indicates whether any entities were added, modified, or deleted within the session. -
Note: The hasChanges property is cleared after calling
saveChanges()
.
const session = store.openSession();
// No changes made yet - 'hasChanges' will be FALSE
assert.ok(!session.advanced.hasChanges());
// Store a new entity within the session
const employee = new Employee();
employee.firstName = "John";
employee.lastName = "Doe";
await session.store(employee);
// 'hasChanges' will now be TRUE
assert.ok(session.advanced.hasChanges());
// 'hasChanges' will reset to FALSE after saving changes
await session.saveChanges();
assert.ok(!session.advanced.hasChanges());
Get session changes
-
Use the session's advanced method
whatChanged()
to get all changes made to all the entities tracked by the session. -
For each entity that was modified, the details will include:
- The name and path of the changed field
- Its old and new values
- The type of change
-
Note:
whatChanged()
reports changes made prior to callingsaveChanges()
.
Calling it immediately after saveChanges will return no results, as the changes are cleared.
Example I
const session = store.openSession();
// Store (add) new entities, they will be tracked by the session
const employee1 = new Employee();
employee1.firstName = "John";
employee1.lastName = "Doe";
const employee2 = new Employee();
employee2.firstName = "Jane";
employee2.lastName = "Doe";
await session.store(employee1, "employees/1-A");
await session.store(employee2, "employees/2-A");
// Call 'WhatChanged' to get all changes in the session
const changes = session.advanced.whatChanged();
assert.equal(Object.keys(changes).length, 2); // 2 entities were added
// Get the change details for an entity, specify the entity ID
const changesForEmployee = changes["employees/1-A"];
assert.equal(Object.keys(changesForEmployee).length, 1); // a single change for this entity (adding)
// Get the change type
const changeType = changesForEmployee[0].change;
assert.equal(changeType, "DocumentAdded");
await session.saveChanges();
Example II
const session = store.openSession();
// Load the entities, they will be tracked by the session
const employee1 = await session.load("employees/1-A");
const employee2 = await session.load("employees/2-A");
// Modify entities
employee1.firstName = "Jim";
employee1.lastName = "Brown";
employee2.lastName = "Smith";
// Delete an entity
session.delete(employee2);
// Call 'WhatChanged' to get all changes in the session
const changes = session.advanced.whatChanged();
// Get the change details for an entity, specify the entity ID
let changesForEmployee = changes["employees/1-A"];
assert.equal(changesForEmployee[0].fieldName, "firstName"); // Field name
assert.equal(changesForEmployee[0].fieldNewValue, "Jim"); // New value
assert.equal(changesForEmployee[0].change, "FieldChanged"); // Change type
assert.equal(changesForEmployee[1].fieldName, "lastName");
assert.equal(changesForEmployee[1].fieldNewValue, "Brown");
assert.equal(changesForEmployee[1].change, "FieldChanged");
// Note: for employee2 - even though the LastName was changed to 'Smith',
// the only reported change is the latest modification, which is the delete action.
changesForEmployee = changes["employees/2-A"];
assert.equal(changesForEmployee[0].change, "DocumentDeleted");
await session.saveChanges();
Syntax
// HasChanges
session.advanced.hasChanges();
// WhatChanged
session.advanced.whatChanged();
Return value | |
---|---|
Record<string, DocumentsChanges> |
Dictionary containing list of changes per document ID |
DocumentsChanges |
Type | Description |
---|---|---|
fieldOldValue | object | Previous field value |
fieldNewValue | object | Current field value |
change | string | Type of change that occurred. Can be: "DocumentDeleted" , "DocumentAdded" ,"FieldChanged" , "NewField" , "RemovedField" , "ArrayValueChanged" , "ArrayValueAdded" , "ArrayValueRemoved" |
fieldName | string | Name of field on which the change occurred |
fieldPath | string | Path of field on which the change occurred |
fieldFullName | string | Path + Name of field on which the change occurred |