OK, here's the thing.

I've got the v2 branch of Simple.Data sitting there, waiting for me to get it to a state where I can release it into the wild.

I also have a shedload of things to do, from the important (my family, my business and the freelance work I have to do to pay the rent) to the middling (speaking engagements, blogging) to the frivolous (binge-watching Homeland season 3, experimenting with Red Bull distillation).

The best way I know to motivate myself to do thing X is to have thing Y to look forward to, then tell myself I can't have Y until I've done X. That's how I got Zudio 2.0 done, by having access to the Elite: Dangerous beta and not letting myself play it until it was done.

So. There are two games I really, really want right now: Disney Infinity 2.0 to play with my daughter, and Sunset Overdrive, to play after she's gone to bed. Which means I need an Xbox One.

I'm not going to lie to you. This is exactly what it looks like. I'm trying to get random strangers to pitch in and buy me an Xbox One. I'm not proud of it, but given that I've put a lot of my spare time into open source work, I'm trying not to be too ashamed of it either.

Fact is, either way, Simple.Data 2.0 will get done, and it will be awesome. But, if this works and I get enough money to buy an Xbox One, I promise I will not even open the box until you can install Simple.Data 2.0 from NuGet. I will take photos and everything.

Here's the link if you want to donate to this incredibly worthy cause:

Click here to lend your support to: Simple.Data and make a donation at pledgie.com !

(What's in 2.0?)

These are the features that will be in the 2.0-alpha1 release (i.e. before I open the Xbox):

Async all the things!

OK, so the biggest change in 2.0 is that everything is async by default. Where in Simple.Data 1.0 you would do this:

var customer = db.Customers.FindById(1);  

in 2.0, you'll do:

var customer = await db.Customers.FindById(1);  

This has various advantages:

  1. Asynchronous I/O is just better. Wherever possible, the underlying adapters and providers will use proper async calls to databases or HTTP or whatever, so you'll get the performance and scalability wins by default.
  2. In 1.0, the few methods which directly returned a result, such as FindByX, couldn't have anything chained onto the end of them, like .WithComments(). In 2.0, all the methods return an awaitable command object which can be chained just like a query.
  3. Batch operations. You can create a bunch of operations using the regular syntax, then execute them in a batch:
await db.Batch(  
  db.Orders.Insert(order),
  db.Invoices.Insert(invoice)
);

There's more to that last one, but that's for another post.

There will be a .Sync() method on everything for when you don't want to await for some reason.

Metadata

Simple.Data 2.0 will expose all the metadata from the underlying data store using a consistent object model. If your application works with multiple vendors' databases, you'll be able to use the Metadata model to access the stuff from INFORMATION_SCHEMA, sys.* or whatever variation your backend uses.

Full object-graph resolution

In 1.0, you can use one level of .With to populate child objects on a graph. 2.0 extends that so you can do this to get a Customer object with an Orders list with the OrderLines list in each Order object:

var customer = await db.Customers.FindById(id).WithOrdersWithOrderLines();  

There's more good stuff for later, but that's the alpha1 feature set.

Sound good? Here's that link button again:

Click here to lend your support to: Simple.Data and make a donation at pledgie.com !