What if the mobile device doesn't have enough memory to store all objects? Or if only a subset of the object need to be in both databases? In this case you can replicate only a subset of all objects.
You can ask the dRS to replicate only the objects of a certain class. Instead of getting the change-set with all objects, it will return only the changed objects of that class.
IObjectSet changesOnDesktop =
replicationSession.ProviderA().ObjectsChangedSinceLastReplication(typeof (Pilot));
foreach (object changedObjectOnDesktop in changesOnDesktop)
{
replicationSession.Replicate(changedObjectOnDesktop);
}
replicationSession.Commit();
Dim changesOnDesktop As IObjectSet = _
replicationSession.ProviderA().ObjectsChangedSinceLastReplication(GetType(Pilot))
For Each changedObjectOnDesktop As Object In changesOnDesktop
replicationSession.Replicate(changedObjectOnDesktop)
Next
replicationSession.Commit()
For more complex cases a simple condition can be a solution. Add a simple condition within the replication loop to select which objects are replicated and which ones not.
IObjectSet changesOnDesktop = replicationSession.ProviderA().ObjectsChangedSinceLastReplication();
foreach (object changedObjectOnDesktop in changesOnDesktop)
{
if (changedObjectOnDesktop is Car)
{
if (((Car) changedObjectOnDesktop).Name.StartsWith("M"))
{
replicationSession.Replicate(changedObjectOnDesktop);
}
}
}
replicationSession.Commit();
Dim changesOnDesktop As IObjectSet = _
replicationSession.ProviderA().ObjectsChangedSinceLastReplication()
For Each changedObjectOnDesktop As Object In changesOnDesktop
If TypeOf changedObjectOnDesktop Is Car Then
If DirectCast(changedObjectOnDesktop, Car).Name.StartsWith("M") Then
replicationSession.Replicate(changedObjectOnDesktop)
End If
End If
Next
replicationSession.Commit()
It's also possible to query for the objects and the replicate those objects. However in this case, also unchanged objects are replicated again.
IList<Car> changesOnDesktop =
desktopDatabase.Query(delegate(Car car) { return car.Name.StartsWith("M"); });
foreach (Car changedObjectOnDesktop in changesOnDesktop)
{
replicationSession.Replicate(changedObjectOnDesktop);
}
replicationSession.Commit();
Dim changesOnDesktop As IList(Of Car) = _
desktopDatabase.Query(Function(car As Car) car.Name.StartsWith("M"))
For Each changedObjectOnDesktop As Car In changesOnDesktop
replicationSession.Replicate(changedObjectOnDesktop)
Next
replicationSession.Commit()
Of course it possible to use a combination of these three possibilities. For example you can request the changes for a certain class and then filter with a condition.
The IObjectSet is also an IEnumerable, so you can use LINQ to filter the objects.
Note that dRS tries to avoid inconsistent replications. When replicating a object all its referenced objects are replicated as well. This avoids a incomplete and inconsistent object graphs. So for example when you do a selective replication of the Car objects, dRS will also replicate all Pilots which are referenced by the Car objects.