There are two possible approaches in OpenAccess for handling relations between objects. One of them is having a reference to the other object as in the example you posted. In this case when you have the ID of the referenced object, you can load the object by its id and assign it to the referencing object. This should work for you:
|offer.Material = (Material) scope.GetObjectById(Database.OID.ParseObjectId(typeof(Material), o.Material.MaterialId.ToString()));
I suggest you to use this approach.
The other way is not having a reference to the referenced object at all, but a field with its ID only. This can be achieved (if you are using reverse mapping) by removing the reference that is generated by default in the Reverse mapping wizard. If doing so, a field for the foreign ID will be created. In your case you will get a MaterialID property instead of the Material reference. Then you can set the ID directly to that property as you have used to do. But this complicates the work with the related object - you will have to load it explicitly every time when you want to use it. That is why I suggested you to use the first approach.
the Telerik team