After using NHibernate and Massive there was room for yet another ORM in my life. The ORM is called Simple.Data. Simple.Data was written by Mark Rendle.

Setting it up

I installed these packages.

  • Simple.Data.SqlCompact40
  • SqlServerCompact 4.0.8482.1

Because those were the packages that were available on Nuget.

So I’m gonna test Simple.Data with the SQLserver compact edition.

Simple.Data can be used with many other databases as well. And even some nosql databases.

To my surprise also as a very good Manual available to you. But it only has C# samples. I’ll be using VB.Net for this post.

First I m gonna create a database.

vbnet Private Function CreateDatabase() As SqlCeEngine If File.Exists("test.sdf") Then File.Delete("test.sdf") Dim connectionString = "DataSource=""test.sdf""; Password=""mypassword""" Dim en = New SqlCeEngine(connectionString) en.CreateDatabase() Return en End Function The above will delete the database when it is already there and create a new one for me.

Then I have to add a table to my database.

vbnet Private Sub CreateTablePerson() Using cn = New SqlCeConnection("DataSource=""test.sdf""; Password=""mypassword""") If cn.State = ConnectionState.Closed Then cn.Open() End If Dim sql = "create table Person (LastName nvarchar (40) not null, FirstName nvarchar (40))" Using cmd = New SqlCeCommand(sql, cn) cmd.ExecuteNonQuery() End Using End Using End Sub This uses the same connectionstring and adds a very simple table called Person to my database.

Now I want to test the above. So I created a ConsoleApplication and in the Main function I add the calls to CreateDatabase and CreateTablePerson.

That was simple so far ;-).

The above was all SQL compact syntax and just to set us up with something to test Simple.Data with. Now on to the interesting part.


First we need to tell Simple.Data where it can find our database.

vbnet Dim db = Simple.Data.Database.OpenConnection("DataSource=""test.sdf""; Password=""mypassword""") this gives us a database object which we will use to query our data.

For the next step you have to set OPTION STRICT OFF because Simple.Data uses the dynamic parts of the .Net framework.

First thing to do is to insert some data into our table.

vbnet db.Persons.Insert(New With {.LastName = "lastname1", .FirstName = "firstname1"}) We use the db object to tell it to insert something into the table Persons. Notice how our table is called Person in the database but we can use Persons as our identifier for Simple.Data? Yeah that is awesome. But you can also write this.

vbnet db.Person.Insert(New With {.LastName = "lastname1", .FirstName = "firstname1"}) And Simple.Data will still figure it out.

Of course a good set of integration tests is required to make sure that Simple.Data does the right thing all the time would be wise choise because we are relying on a bit of magic here to do our work for us, and magic does not always do what we expect it to do.

Now that we have our data in the table we can query it and write it out to the console.

vbnet Dim result = db.Persons.FindByLastName("lastname1") Console.WriteLine(result.LastName & " " & result.FirstName) So again we use the Person table and now we use the FindBy qualifier followed by the name of our column and then we just pass our value to that, very simple.

Go read this part of the documentation to find out how it works.

In essence I’m also countin on it returning just one object. But what happens if multiple objects come back.

First I make sure to insert 2 rows with the same lastname.

vbnet db.Person.Insert(New With {.LastName = "lastname1", .FirstName = "firstname1"}) db.Person.Insert(New With {.LastName = "lastname1", .FirstName = "firstname2"}) And then I do this again.

vbnet Dim result = db.Persons.FindByLastName("lastname1") Console.WriteLine(result.LastName & " " & result.FirstName) and that will just return the first one.

If I want to get all persons with that lastname I have to use FindAllByLastName like so.

vbnet Dim result = db.Persons.FindAllByLastName("lastname1") Of course now I will have to change my Console.WriteLine too.

vbnet Dim result = db.Persons.FindAllByLastName("lastname1") For Each person In result Console.WriteLine(person.LastName & " " & person.FirstName) Next


Simple.Data is pretty cool and it makes querying your database very simple and neat. But since this is all done by using the Dynamic Language Runtime I would hihgly recommend having Automated tests.