Wednesday, September 01, 2010

esvideo

Sometimes you’re so busy designing, coding, testing, and supporting a product that you don’t take the time to stop and appreciate what you have actually accomplished. A customer of ours asked us to create a video overview of our Silverlight functionality and in doing so we had to step back and say “wow”, this is pretty cool. It truly is easy to use EntitySpaces to create a Silverlight application as you will see.

This video shows the various pieces of an EntitySpaces application for Silverlight:

1) The EntitySpaces architecture itself.

2) The WCF Service to retrieve the data.

3) Some kind of row level, column level tracking on the Silverlight side of things (our proxies).

The good news is that EntitySpaces provides all three of these for you and more as you will soon see. The real beauty in this video is how the EntitySpaces server and client proxies are used to serialize data back and forth across the wire all the while tracking row level and column level dirty state. Also, the creation of the WCF service itself which utilizes the EntitySpaces architecture and allows you to take full advantage of the EntitySpaces DynamicQuery API under Silverlight is awesome. In fact, it’s hard to tell that you’re not on the server side because our client proxies look and feel just like the full EntitySpaces architecture.

Well, enough talk. Click on the image above and check out the video, it’s kind of large so give it a minute to download, but it’s worth it. Pay close attention to how few lines of code we actually wrote by hand to create our Silverlight demo, and how simple those lines of code actually are. There’s already a lot to learn when you start working with Silverlight, why not make it easy on yourself and use EntitySpaces? Our Trial version is fully functional and comes with everything you see in this video, including the demo in C# or VB.NET.

EntitySpaces

From Mobile Devices to large scale enterprise solutions in need of serious transaction support, EntitySpaces can meet your needs. Whether you’re writing an ASP.NET application with Medium Trust requirements, a Silverlight/WCF application, a Mono application, or a Windows.Forms application, the EntitySpaces architecture is there for you. EntitySpaces is provider independent, which means that you can run the same binary code against any of the supported databases. EntitySpaces is available in both C# and VB.NET. EntitySpaces uses no reflection, no XML files, and sports a tiny foot print of less than 300k. Pound for pound, EntitySpaces is one tough, dependable .NET architecture.

EntitySpaces LLC
Persistence Layer and Business Objects for Microsoft .NET
http://www.entityspaces.net

posted on Wednesday, September 01, 2010 8:25:41 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
 Sunday, August 29, 2010

This release of EntitySpaces adds two new databases, adds Silverlight 4 support (we already supported Silverlight 3), provides some excellent proxy improvements, and finally it provides a few well placed customer requested tweaks. EntitySpaces 2010.1.0830.0 is available to customers for download now. Our trial version will be upgraded by Tuesday night, perhaps sooner.

It is recommended that you regenerate your “Generated” classes and any proxies you may be using. Also, we recommend that you re-generate any WCF Services that you may be using that were generated by EntitySpaces in order to realize the improvements mentioned below.

Two New Databases

  • Microsoft SQL Azure is now supported. Just choose “SQL Azure” in the “Driver” dropdown on the settings tab and generate your architecture as you would normally. You still use our normal EntitySpaces.SqlClientProvider.dll provider when running your SQL Azure application.
  • Microsoft SQL Server Compact 4.0 is now supported. We already support 3.x and we now we also support the 4.0 Technology Preview release. The SQL CE 4.0 CTP can be found HERE. This version of the SQL Server Compact Edition passes more of our unit tests than did the 3.x version. For instance, 4.0 supports paging. Also, we have upgraded our SQL CE 3.x driver to 3.5.1.0.

    To connect to the SQL CE 4.x driver use this in your connection string (only needed when generating code):

    Data Source=C:\SomeDatabase.sdf;Version="4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

Proxy Improvements

  • We now provide both Silverlight 3.0 and 4.0 Assemblies (please notice the folder structure change in your Runtimes folder for the Silverlight assemblies).
  • Added Collection.LoadAll() methods to the generated WCF Services (See our WCF Template).
  • Added IsDirty() to both the single entity and collection proxy stub classes.
  • Fixed a minor bug in the Collection.Save() method in the Proxy classes. The deleted entities were being brought back in the return collection from Save(), this has been fixed. This was not reported by a user, we found this in our testing.

Other Improvements and Fixes

  • There was an issue with calling Find() on a binding source. This has been fixed.
  • Added HasFilter on the Collection class and added a “get” on the Filter property.
  • Collection.AddNew() was made virtual so that it can be overridden.
  • There was an issue with our collections not working in Windows Forms design mode, this has been fixed.
  • Reworked our C# and VB.NET Windows.Forms samples.
  • Reworked our WCF Demo so that it now uses an ES generated WCF Service.

EntitySpaces

From Mobile Devices to large scale enterprise solutions in need of serious transaction support, EntitySpaces can meet your needs. Whether you’re writing an ASP.NET application with Medium Trust requirements, a Silverlight/WCF application, a Mono application, or a Windows.Forms application, the EntitySpaces architecture is there for you. EntitySpaces is provider independent, which means that you can run the same binary code against any of the supported databases. EntitySpaces is available in both C# and VB.NET. EntitySpaces uses no reflection, no XML files, and sports a tiny foot print of less than 300k. Pound for pound, EntitySpaces is one tough, dependable .NET architecture.

EntitySpaces LLC
Persistence Layer and Business Objects for Microsoft .NET
http://www.entityspaces.net

posted on Sunday, August 29, 2010 10:22:44 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
 Wednesday, August 25, 2010

Although the ORMBattle.NET charts have not been updated yet we thought we would share the results with you. The stats shown below are the stats that they will use to update the charts on their site (they use the 1000 item tests). We think we did pretty well. The numbers shown below are from the ORMBattle.NET site.

First let’s talk about where EntitySpaces did really well.

BLT = BLToolkit
EF  = Microsoft Entity Framework
ES  = EntitySpaces
DO  = DataObjects.Net
LC  = LinqConnect
LS2 = LINQ to SQL
NH  = NHibernate
OA  = OpenAccess

SS = SubSonic

Our “Single Operation” Tests

Let’s first take a a look at the Single Operation CRUD performance tests. These are single entity updates. So, the first set of numbers highlighted in blue are our numbers and we scored very high. These numbers are very important because they represent 1000 entities being created, building the dynamic SQL to do the update/insert/delete, a wire trip to the database, and returning any modified fields such as identity columns. In other words, the full meal deal.

It is obvious from these numbers EntitySpaces can do this very efficiently. Our “Multiple Operation” tests are discussed below.


ormbattle


Our “Multiple Operation” Tests

We didn’t score as high here as we would have liked. It’s important to note that when saving a collection (a collection merely contains single entities) we use the exact same logic as when we save a single entity. So you must be thinking since we scored so well in the “Single Operation” tests why then aren’t we at the top of the “Multiple Operations” tests? Well, one of the nice things about EntitySpaces is that it truly only updates only those columns which are dirty. This means we created unique SQL for every single row (1000 of them in this case) when in reality we only needed to build the SQL one time since the test uses a for loop and changes the exact same columns for each row. However, even with this extra functionality we handily out performed the Microsoft Entity Framework, LINQ to SQL, and SubSonic. We are not sure if the other architectures updated only the modified columns or all columns, we suspect they update them all, but it really wont matter soon as you will see.

We have long known we could optimize here and that is exactly our plan. All we must to do is examine the ModifiedColumns collection of the previous row to see if we can reuse the same SQL statement. Once we do that our numbers will shoot up dramatically (and you will of course benefit). In fact, we expect to be at or near the top in that category as well on our next run. These changes are simple to make. Once we make these changes we will publish before and after numbers using the exact same code from the ORMBattle.NET site and publish those here so you can see the improvements, and we expect those to be dramatic. Once ORMBattle.NET does another round of testing these new numbers will be published there as well.

Native Query and Native Materialize Tests

We also scored very well in the Native Query test which uses our DynamicQuery API and we scored near the top in the Native Materialize test which does a LoadAll() on a collection and then merely does a foreach loop through each entity (this tests materializing each row). You can see how fast we are in those two tests and loading a large collection is extremely fast in EntitySpaces.

LINQ Tests

Note that there are no “n/a” entries for EntitySpaces. This is kind of interesting since most of our customers use our DynamicQuery API and not LINQ. However, we do support LINQ when the ADO.NET provider we are using supports it. This is true for 4 or 5 of the database systems we support.

Next Steps

Other than the “Multiple Operation” tests we have one other issue to fix, and that is when a massive collection “delete all” operation is performed. Our MarkAllAsDeleted() moves all of the deleted entities into a deleted list one by one. We can do this in one big operation instantly so that we’ll be fixed as well. We know we will drastically increase our collection save logic and we’ll post those numbers (before and after soon). First though, we need to get this weekend’s release out with our SQL Azure support.

After we make our next round of performance changes we expect EntitySpaces to be at or near the top in almost every category, and we’re already well on our way. This performance work will happen immediately after this weekends release, so stay tuned. Our entry into ORMBattle.NET fray is going to benefit you the customer because it’s something that we take very seriously. We are happy with round one, but round two is going to put us in a very good position.

EntitySpaces

From Mobile Devices to large scale enterprise solutions in need of serious transaction support, EntitySpaces can meet your needs. Whether you’re writing an ASP.NET application with Medium Trust requirements, a Silverlight/WCF application, a Mono application, or a Windows.Forms application, the EntitySpaces architecture is there for you. EntitySpaces is provider independent, which means that you can run the same binary code against any of the supported databases. EntitySpaces is available in both C# and VB.NET. EntitySpaces uses no reflection, no XML files, and sports a tiny foot print of less than 300k. Pound for pound, EntitySpaces is one tough, dependable .NET architecture.

EntitySpaces LLC
Persistence Layer and Business Objects for Microsoft .NET
http://www.entityspaces.net

posted on Wednesday, August 25, 2010 10:06:49 PM (Eastern Standard Time, UTC-05:00)  #    Comments [3]
 Saturday, August 21, 2010
SQL-Azure

Our SQL Azure support now successfully passes our NUnit test suite. It is our plan to release our SQL Azure support on Monday, August 30th. There are also other Cloud databases we are looking at.

There is a new choice in the “Settings” tab in the driver combo-box called “SQL Azure”, you just select it, connect, and generate your EntitySpaces architecture as you would normally.

EntitySpaces LLC
Persistence Layer and Business Objects for Microsoft .NET
http://www.entityspaces.net

posted on Saturday, August 21, 2010 1:24:14 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
 Monday, August 16, 2010

This release is recommended if your application is a Windows.Forms application. We fixed a bug that happened when the user pressed the “escape” key while editing in a grid. If you are upgrading from our 2010.1.0802.0 release there is no need to regenerate your classes.

EntitySpaces

From Mobile Devices to large scale enterprise solutions in need of serious transaction support, EntitySpaces can meet your needs. Whether you’re writing an ASP.NET application with Medium Trust requirements, a Silverlight/WCF application, a Mono application, or a Windows.Forms application, the EntitySpaces architecture is there for you. EntitySpaces is provider independent, which means that you can run the same binary code against any of the supported databases. EntitySpaces is available in both C# and VB.NET. EntitySpaces uses no reflection, no XML files, and sports a tiny foot print of less than 300k. Pound for pound, EntitySpaces is one tough, dependable .NET architecture.

EntitySpaces LLC
Persistence Layer and Business Objects for Microsoft .NET
http://www.entityspaces.net

posted on Monday, August 16, 2010 4:58:56 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
 Friday, August 13, 2010

The Microsoft SQL Server 2008 FILESTREAM type can be a bit tricky to figure out. Hopefully this post will help those interested in using it. The first thing you need to do is enable FILESTREAM in your SQL Server 2008 instance. The instructions can be found HERE.

Our next step was to create our SQL table for testing.

CREATE TABLE [dbo].[FileStreamEmployees]
(
    [EmployeeId] [int] NOT NULL,
    [Photo] [varbinary](max) FILESTREAM  NULL,
    [RowGuid] [uniqueidentifier] ROWGUIDCOL  NOT NULL
)

Notice that we have our Photo column set as our FILESTREAM column (shown above).

Our next step was of course to create our “Gnerated” and “Custom” classes. These classes are generated for you in seconds, see this video if you are new to EntitySpaces.

One of the tricks when working with SqlFileStream (which is located in the System.Data.SqlTypes namespace) is that it requires a transaction. So, what we did was make a tiny little class called esSqlFileStream that would hold onto both the esTransactionScope instance and the SqlFileStream instance. Let’s look at how all this works.

First, we created a sample record to play with.

// Create a sample record just for the demo
FileStreamEmployees emp = new FileStreamEmployees();
emp.EmployeeId = 1;
emp.Photo = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
emp.Save();

Now, let’s execute some code and see if we can read back the Photo column using streaming and not the entity itself.

//---------------------------------
// Let's test reading
//---------------------------------
esSqlFileStream stream = FileStreamEmployees.GetFileStream(1, FileAccess.Read);

int length = (int)stream.Length;
byte[] data = new byte[length + 1];

// Fill our data buffer
stream.Read(data, 0, length);
stream.Dispose();

Notice that we call a static method on our FileStreamEmployees entity named GetFileStream(). We added that to our Custom class. We’ll take a look at that method in just a moment. Also, we could have used the using() syntax on the esSqlFileStream object but we wanted to demonstrate how you could create an esSqlFileStream object and then pass it around to other methods if need be. This is why we needed to manually call Dispose on it in the sample above. 

Now, let’s execute some code and see if we can write to the Photo column using streaming (and without calling Save on the entity).

//---------------------------------
// Let's test writing
//---------------------------------
esSqlFileStream stream = FileStreamEmployees.GetFileStream(1, FileAccess.Write);

data = new byte[] { 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 };
stream.Write(data, 0, data.Length);
stream.Dispose();

Pretty simple looking really. There is one very important thing to note here. As long as you’re holding onto an esSqlFileStream there is a transaction open. So, you want to get in and out as fast as you can just as you would whenever you are holding a transaction open. Now, let’s take a look at our static GetFileStream() method which is located in our FileStreamEmployees Custom class.

using System;
using System.IO;
using System.Data.SqlTypes;

using EntitySpaces.Core;
using EntitySpaces.Interfaces;
using EntitySpaces.DynamicQuery;

namespace BusinessObjects
{

    // This is in our “Custom Class”
    public partial class FileStreamEmployees : esFileStreamEmployees
    {
        static public esSqlFileStream GetFileStream(int id, FileAccess access)
        {
            esSqlFileStream fileStream = new esSqlFileStream();

            FileStreamEmployeesQuery q = new FileStreamEmployeesQuery();
            q.Select("<Photo.PathName() as [Path]>", "<GET_FILESTREAM_TRANSACTION_CONTEXT() as [Context]>");
            q.Where(q.EmployeeId == id);

            FileStreamEmployees fsEmp = new FileStreamEmployees();
            fsEmp.Load(q);

            fileStream.Create((string)fsEmp.GetColumn("Path"),
                (byte[])fsEmp.GetColumn("Context"), access, FileOptions.SequentialScan, 0);

            return fileStream;
        }
    }
}

Notice that we use the “Raw SQL” feature to inject this very SQL Server specific code into our Select() statement. Remember that EntitySpaces is database independent and we try to avoid polluting the core with DBMS specific functions. Typically, you use very little or no “Raw SQL” in EntitySpaces. However, this mechanism is a really nice escape hatch when needed. Basically, the method above fetches the path to our Photo blob and uses the esTransactionScope transaction which is created in the constructor of the esSqlFileStream class.

Finally, let’s look at the esSqlFileStream class.

using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.IO;
using System.Linq;
using System.Text;

using EntitySpaces.Interfaces;

namespace BusinessObjects
{
    public class esSqlFileStream : IDisposable
    {
        public esSqlFileStream()
        {
            scope = new esTransactionScope();
        }

        public void Create(string path, byte[] transactionContext, FileAccess access, FileOptions options, long allocationSize)
        {
           stream = new SqlFileStream(path, transactionContext, access, options, 0);
        }

        public int Read(byte[] buffer, int offset, int count)
        {
            return stream.Read(buffer, offset, count);
        }

        public void Write(byte[] buffer, int offset, int count)
        {
            stream.Write(buffer, offset, count);
        }

        public long Length
        {
            get
            {
                return stream != null ? stream.Length : 0;
            }
        }

        public void Dispose()
        {
            stream.Close();
            stream.Dispose();
            scope.Complete();
        }

        private esTransactionScope scope;
        private SqlFileStream stream;
    }
}

Notice that there is no error handling in this sample code. We wanted to keep this simple so it could be easily understood. Basically, the esSqlFileStream class wraps the SqlFileStream and holds onto the esTransactionScope during its lifetime. You only need to remember to call Dispose() or use it within a using() statement.

This really isn’t a class that we’ll include in the EntitySpaces architecture. This post is merely to show one way to potentially work with SqlFileStream objects in your application, if you plan to use them. Comments are welcome …

EntitySpaces

From Mobile Devices to large scale enterprise solutions in need of serious transaction support, EntitySpaces can meet your needs. Whether you’re writing an ASP.NET application with Medium Trust requirements, a Silverlight/WCF application, a Mono application, or a Windows.Forms application, the EntitySpaces architecture is there for you. EntitySpaces is provider independent, which means that you can run the same binary code against any of the supported databases. EntitySpaces is available in both C# and VB.NET. EntitySpaces uses no reflection, no XML files, and sports a tiny foot print of less than 300k. Pound for pound, EntitySpaces is one tough, dependable .NET architecture.

EntitySpaces LLC
Persistence Layer and Business Objects for Microsoft .NET
http://www.entityspaces.net

posted on Friday, August 13, 2010 9:25:29 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
 Sunday, August 08, 2010

We updated our Getting Started Video (which is also on our download page). The video uses EntitySpaces 2010 and Visual Studio 2010 and shows how within seven minutes you’re ready to run your first EntitySpaces application.

EntitySpaces

From Mobile Devices to large scale enterprise solutions in need of serious transaction support, EntitySpaces can meet your needs. Whether you’re writing an ASP.NET application with Medium Trust requirements, a Silverlight/WCF application, a Mono application, or a Windows.Forms application, the EntitySpaces architecture is there for you. EntitySpaces is provider independent, which means that you can run the same binary code against any of the supported databases. EntitySpaces is available in both C# and VB.NET. EntitySpaces uses no reflection, no XML files, and sports a tiny foot print of less than 300k. Pound for pound, EntitySpaces is one tough, dependable .NET architecture.

EntitySpaces LLC
Persistence Layer and Business Objects for Microsoft .NET
http://www.entityspaces.net

posted on Sunday, August 08, 2010 4:40:53 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
 Sunday, August 01, 2010

This is a minor release, there is no need to upgrade unless you need one of the fixes below. The fixes are as follows:

The Trial version for 2010.1.0802.0 will be posted late Sunday night, you will know it has been posted when the Trial Download page has the proper version on it.

EntitySpaces

From Mobile Devices to large scale enterprise solutions in need of serious transaction support, EntitySpaces can meet your needs. Whether you’re writing an ASP.NET application with Medium Trust requirements, a Silverlight/WCF application, a Mono application, or a Windows.Forms application, the EntitySpaces architecture is there for you. EntitySpaces is provider independent, which means that you can run the same binary code against any of the supported databases. EntitySpaces is available in both C# and VB.NET. EntitySpaces uses no reflection, no XML files, and sports a tiny foot print of less than 300k. Pound for pound, EntitySpaces is one tough, dependable .NET architecture.

EntitySpaces LLC
Persistence Layer and Business Objects for Microsoft .NET
http://www.entityspaces.net

posted on Sunday, August 01, 2010 12:55:23 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
 Sunday, July 25, 2010

This is a minor release, there is no need to upgrade unless you need one of the fixes below. The fixes are as follows:

  • The WCF Client Side Proxy Patch is included (it was not included with 2010.1.0720.0)
  • The namespace "Proxies" was hard coded in the client proxy template, this was fixed.
  • The “char” modified column count error has been fixed.
  • The case sensitive bug when returning columns with a different case than defined in the actual table error has been fixed.

The Trial version is still 2010.1.0720.0

EntitySpaces

From Mobile Devices to large scale enterprise solutions in need of serious transaction support, EntitySpaces can meet your needs. Whether you’re writing an ASP.NET application with Medium Trust requirements, a Silverlight/WCF application, a Mono application, or a Windows.Forms application, the EntitySpaces architecture is there for you. EntitySpaces is provider independent, which means that you can run the same binary code against any of the supported databases. EntitySpaces is available in both C# and VB.NET. EntitySpaces uses no reflection, no XML files, and sports a tiny foot print of less than 300k. Pound for pound, EntitySpaces is one tough, dependable .NET architecture.

EntitySpaces LLC
Persistence Layer and Business Objects for Microsoft .NET
http://www.entityspaces.net

posted on Sunday, July 25, 2010 10:39:06 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
 Friday, July 23, 2010

A cool way to play around with the EntitySpaces DynamicQuery API is to use LINQPad, which is a free tool. It’s easy to setup and with the addition of the DynamicQuery.Parse() method on the query object some time back you can now ask the EntitySpaces Provider to produce the SQL for a query without actually executing it. Here’s a quick preview.

Below is the LINQPad Window containing all of the code necessary to execute our simple query.

Main

Below are the things we had to do get LINQPad to execute our query. It only takes a few minutes.

  1. Setup the Loader.
  2. Register a connection (no connection string required, you just need enough to load the ES provider)
  3. Type in the Query
  4. Call the Parse() method

When you click the “Green Arrow” on the toolbar your query executes and you can see the SQL generated in the results pane at the bottom of the window.

There were two other one time operations we needed to perform. We had to add a few references and a few namespaces, that’s it. The next two screens show how to accomplished this.

references

Notice the references we added. We needed to add the System.Configuration namespace because the classes in EntitySpaces that allow you to manually setup a connection string require it. Unfortunately, we had to browse directly to the assembly on disk, it’s not like adding a reference in Visual Studio where it lists everything in the GAC. We then added the required EntitySpaces assemblies. Finally, we added our BusinessObjects class library which contains the EntitySpaces generated and custom classes. You need to place your entities into a class library so you can add a reference to it. This only takes a few seconds. Create a class library, click on your generated and custom folders from your main solution and just copy them into your BusinessObjects solution, add the EntitySpaces references and compile.

namespaces

Next we added the required Namespaces. However, and important be sure to click the “Set as default for new queries” button and you’ll never have to add assemblies or namespaces again, you’ll have your EntitySpaces DynamicQuery playground tool all setup for future use.

Finally, we could have added all of the EntitySpaces DataProviders and not just EntitySpaces.SqlClientProvider.dll and then we could just change the “conn.Provider” value in the code and we could see what the resulting SQL would look like for SQLite, Sybase, Oracle and so on … 

We didn’t try the intellisense add-on for LINQPad but we assume that would work fine, but we do not know for sure, perhaps we’ll try it soon and report back. Also, we’ve got some great idea’s cooked up for the EntitySpaces “Winter Brew” version, more on that later.

For those that want to try this here is the source code in the above window to make it easy on you …

esProviderFactory.Factory = new esDataProviderFactory();

// Just enough to Load the Provider
esConnectionElement conn = new esConnectionElement();
conn.Name = "SQL";
conn.Provider = "EntitySpaces.SqlClientProvider";
conn.ProviderClass = "DataProvider";
conn.SqlAccessType = esSqlAccessType.DynamicSQL;
conn.ProviderMetadataKey = "esDefault";

esConfigSettings.ConnectionInfo.Connections.Add(conn);
esConfigSettings.ConnectionInfo.Default = "SQL";

// THE ACTUAL QUERY
EmployeesQuery q = new EmployeesQuery();
q.es.Top = 15;
q.Select(q.EmployeeID, q.FirstName, q.BirthDate.As("ExtraColumn"));

// Ask the provider to produce the SQL
string sql = q.Parse();

Console.WriteLine(sql);

EntitySpaces

From Mobile Devices to large scale enterprise solutions in need of serious transaction support, EntitySpaces can meet your needs. Whether you’re writing an ASP.NET application with Medium Trust requirements, a Silverlight/WCF application, a Mono application, or a Windows.Forms application, the EntitySpaces architecture is there for you. EntitySpaces is provider independent, which means that you can run the same binary code against any of the supported databases. EntitySpaces is available in both C# and VB.NET. EntitySpaces uses no reflection, no XML files, and sports a tiny foot print of less than 300k. Pound for pound, EntitySpaces is one tough, dependable .NET architecture.

EntitySpaces LLC
Persistence Layer and Business Objects for Microsoft .NET
http://www.entityspaces.net

posted on Friday, July 23, 2010 1:12:57 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]