I have a C#/WPF application has has been developed with several class instances. Of course these are not persistent. I would like to bind the class instances to MongoDB collections for persistence and to enable backups.
How can I bind a class instance to a MongoDB collection so as the content of the class instance changes the changes will be reflected in the MongoDB collection?
Hi,
Have a look at this example that save C # class instance and retrieve it.
Hi,
Thanks for the sample code. I am looking for a way to bind a class to a collection. The code has been written and I don’t want to rewrite it
I want to continue to read and write the class instance and have it bound to the collection.
Hi,
You need to decide when to write the instance in MongoDB.
I don’t recommand to write every modification automatically.
It’s possible but this is not a MongoDB feature, this is a C# feature.
Read the instance on screen opening.
Write it on screen closing for example.
Here are 3 strategies to use class that you can’t adapt with MongoDB.
- you can use inherence to add an id field
public class theClassICantChange
{
public string Name;
…
}public class mdbWrapper : theClassICantChange
{
public ObjectId id;
}
and then use the wrapper class for db insert/query
- you can serialize “manually”
BsonDocument doc = o2.ToBsonDocument();
the insert and query BsonDocument
Look at examples 3 and 1
- More complex, you can write your own serializer
Hi,
Thanks for the additional information.
I have implemented a process where I first DropCollection and immediately InsertMany attempting to “replace” the collection with the class instance.
This works most of the time but because I have multiple clients accessing the database, occasionally the collection gets dropped and not created as this process is not collection atomic.
I tried to use a transaction to update the collection with …
using (var session = await client.StartSessionAsync())
session.StartTransaction();
… but I get an error that says you can’t do a transaction on a single server instance and I cannot change the database configuration
What do want to achieve ? Some sort of synchronization between clients?
Dropping the collection is not recommanded.
Try
await collection.DeleteManyAsync(_ => true);
to delete all records.