Entity Framework Code First + ViewMakerの開発は楽しい!!

以下のコードだけでDBアプリができてしまいます。SQLコードゼロ、XAMLゼロなので本当にC#だけで開発ができてしまいます。
Naked Objectsの思想に近いかもしれませんが、ドメインモデル+ViewModelで業務アプリ開発のブレークスルーを目指したいです。

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Windows;
using System.Windows.Input;
using ViewMaker;

namespace CodeOnlyDevelop
{
    public class Category
    {
        [Key]
        [Required]
        public virtual string CategoryId { get; set; }
        public virtual string Name { get; set; }

        public virtual ICollection<Product> Products { get; set; }
    }

    public class Product
    {
        [Key]
        [Required]
        public virtual int ProductId { get; set; }
        public virtual string Name { get; set; }
        public virtual string CategoryId { get; set; }
    }

    public class ProductContext : DbContext
    {
        public DbSet<Category> Categories { get; set; }
        public DbSet<Product> Products { get; set; }
    }

    public class EditListViewModel<T> : ViewModel where T : new()
    {
        private ProductContext db;

        [Browsable(true)]
        public ObservableCollection<T> ListData
        {
            get { return _listData; }
            set { _listData = value; OnPropertyChanged("ListData"); }
        }
        public ObservableCollection<T> _listData;

        public EditListViewModel()
        {
            db = new ProductContext();
        }

        public ICommand LoadCommand { get { return CreateCommand(Load); } }
        private void Load()
        {
            db.Set(typeof(T)).Load();
            ListData = (ObservableCollection<T>)db.Set(typeof(T)).Local;
        }

        public ICommand SaveCommand { get { return CreateCommand(Save); } }
        private void Save()
        {
            db.SaveChanges();
        }
    }

    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ProductContext>());
            ViewUtil.Show(new EditListViewModel<Product>());
            ViewUtil.Show(new EditListViewModel<Category>());
        }
    }
}