Page Type Builder 2.0 released

I’m happy to announce that Page Type Builder version 2.0 has finally been released. It can be downloaded here and soon from the EPiServer NuGet feed.

Compared to the last release candidate, version 1.9.3, this release contains a few minor changes such as:

  • Update to the latest version of Castle.Core.
  • The PageTypePropertyGroup.TypedPageData property has been made protected internal instead of public as having it public lead to problems with circular references in scenarios such as serialization.
  • Work-around for thread safety issue when synchronizing property settings.
  • Fix for global property settings being saved as new rows in the database on each startup even though they haven’t changed.
  • Support for synchronizing property settings on non-public properties.

Compared to the previous stable release (1.3 and 1.3.1) significant changes and additions include:

  • Property Groups – described here and here.
  • Support for property settings – described here.
  • Automatic updating of property types when the underlying data type is the same – described here.
  • Changes made in admin mode to page types and properties are only overwritten on startup if a value for them has been explicitly specified in code.
  • Migrations for page types – described here.
  • Dropped support for defining page types using interfaces, in favor of property groups.
  • Dropped support for specifying settings for the old XHTML editor. Motivation here.

Many thanks to everyone who has contributed, especially to Lee Crowe for his significant contributions, while I’ve been hard at work with Truffler.

Merry Christmas!

PS. For updates about new posts, sites I find useful and the occasional rant you can follow me on Twitter. You are also most welcome to subscribe to the RSS-feed.

Comments

  1. Erik Nilsson's avatar

    Erik Nilsson 2 months ago

    Thanks for the great cristmas gift!

  2. Oskar Zetterberg's avatar

    Oskar Zetterberg 2 months ago

    Awesome.Merry christmas.

  3. Erik Nilsson's avatar

    Erik Nilsson 2 months ago

    Hmm, is pagetypebuilder.dll really supposed to reference episerver cms6 r1 and not r2?

  4. Marcus's avatar

    Marcus 2 months ago

    Best christmas gift ever!

  5. Lee Crowe's avatar

    Lee Crowe 2 months ago

    Nice one Joel, it's here at last ;)

    PTB is the best thing since sliced bread for EPiServer and I am sure the whole community will thank you for all the hard work you have put into developing it for us and finally getting v2.0 out of the door :)

  6. Joel Abrahamsson's avatar

    Joel Abrahamsson 2 months ago

    Hey Erik!

    It is. The intention has been to be backwards compatible with R1 up until version 2.0. As EPiServer adds binding redirects for their assemblies it shouldn't cause any problems unless someone has removed them, in which case there will most likely be other problems. In future releases the R1 support will be dropped and the R2 assemblies will be referenced.

  7. Joel Abrahamsson's avatar

    Joel Abrahamsson 2 months ago

    Lee, it's pretty easy when you do a lot of the work ;-)

  8. Erik Nilsson's avatar

    Erik Nilsson 2 months ago

    Ah, i sort of figured as much,

    It did work without problems in my site, but i use sandcastle to generate some SDK documentation, and when i sent it to the buildserver the SDK builder task got a little upset that there was a reference to a unknown episerver version (since epi is not installed on the buildserver).

    I just got the source and recompiled it with the r2 dll's so all is well in Nansenland.

  9. Hans Hage's avatar

    Hans Hage 1 months ago

    Is this still supported on Oracle?

    I just attempted to upgrade from 1.9.3 to 2.0 (CMS 6 R2) and my development site using Oracle.DataAccess.Client now throws errors whenever any page is served. I'm thinking it has something to do with the database property row change, but that's nothing more than a hunch... I ended up rolling my site back to 1.9.3, but here is my stack trace:

    [OracleException (0x80004005): ORA-00923: FROM keyword not found where expected]
    Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) +996
    Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck) +50
    Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() +4268
    EPiServer.Data.Dynamic.Providers.c__DisplayClass24.b__23() +141
    EPiServer.Data.Dynamic.Providers.c__DisplayClass7.b__6() +199
    EPiServer.Data.Dynamic.Providers.DbDataStoreProvider.InternalExecute(Func`1 method) +128
    EPiServer.Data.Dynamic.Providers.DbDataStoreProvider.ExecuteTransaction(Action action) +87
    EPiServer.Data.Dynamic.Providers.DbDataStoreProvider.SaveStoreDefinition(StoreDefinition storeDefinition) +76
    EPiServer.Data.Dynamic.c__DisplayClass6.b__3() +319
    EPiServer.Data.Cache.LocalCache`2.Add(TKey key, Boolean cacheNullValues, Boolean overwriteExistingValue, Func`1 action) +127
    EPiServer.Data.Dynamic.StoreDefinition.InternalCreate(String storeName, IDictionary`2 typeBag, StoreDefinitionParameters parameters) +175
    EPiServer.Data.Dynamic.EPiServerDynamicDataStoreFactory.CreateStore(String storeName, IDictionary`2 typeBag, StoreDefinitionParameters parameters) +117
    EPiServer.Data.Dynamic.EPiServerDynamicDataStoreFactory.CreateStore(String storeName, Type type, StoreDefinitionParameters parameters) +247
    EPiServer.Data.Dynamic.EPiServerDynamicDataStoreFactory.CreateStore(String storeName, Type type) +12
    PageTypeBuilder.Migrations.MigrationsHook.GetStore() +58
    PageTypeBuilder.Migrations.MigrationsHook.ValidateMigrations(IEnumerable`1 migrations) +141
    PageTypeBuilder.Migrations.MigrationsHook.PreSynchronization(ISynchronizationHookContext context) +171
    PageTypeBuilder.Synchronization.Hooks.HooksHandler.b__1(IPreSynchronizationHook h) +41
    System.Collections.Generic.List`1.ForEach(Action`1 action) +56
    PageTypeBuilder.Synchronization.Hooks.HooksHandler.InvokePreSynchronizationHooks() +166
    PageTypeBuilder.Synchronization.PageTypeSynchronizer.SynchronizePageTypes() +15
    PageTypeBuilder.Initializer.Initialize(InitializationEngine context) +77
    EPiServer.Framework.Initialization.InitializationEngine.InitializeModules() +343
    EPiServer.Framework.Initialization.InitializationEngine.Initialize(HostType hostType) +82
    EPiServer.Framework.Initialization.InitializationModule.Initialize(HostType hostType) +163
    EPiServer.Framework.Initialization.InitializationModule.FrameworkInitialization(HostType hostType) +68
    EPiServer.Global..ctor() +54
    ASP.global_asax..ctor() +4

    [TargetInvocationException: Exception has been thrown by the target of an invocation.]
    System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) +0
    System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) +86
    System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) +230
    System.Activator.CreateInstance(Type type, Boolean nonPublic) +67
    System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +1051
    System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +111
    System.Web.HttpApplicationFactory.GetNormalApplicationInstance(HttpContext context) +221
    System.Web.HttpApplicationFactory.GetApplicationInstance(HttpContext context) +107
    System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +289

  10. Joel Abrahamsson's avatar

    Joel Abrahamsson 1 months ago

    Hi Hans,

    Could it be that you previously didn't have PageTypeBuilder.Migrations.dll referenced but added that when you upgraded? It seems the exception is thrown when the Migrations extension tries to create a DDS store to save the current migration number in.

    In general PTB isn't tested against Oracle but on the other hand it never accesses the DB directly but goes through EPiServer's APIs.

Follow me on Twitter

  1. I don't know what she was selling. How rude of me not to ask! 23 hours ago
  2. Muahaha, I just talked a telephone sales person into letting ME send THEM an invoice. She even gave me their org nbr and other details. 23 hours ago
  3. SL/MTR når nya höjder inom dålig informationsspridning idag. Tavlan säger en sak, megafonen en annan, personalen som skriker en tredje 2 days ago
follow me

Latest comments

  1. Martin S. wrote "Perfect stuff, that's just how to do it! Reminds me of an..." on Dear telephone sales woman
  2. Marcus Granström wrote "Poor girl. She didn't know what hit her when she called the ..." on Dear telephone sales woman
  3. Marthin wrote "Happy coding mate!" on New computer, anguish and excitement

About this site

This blog is built with EPiServer Community, EPiServer CMS, ASP.NET MVC and a bunch of other great products. The source code is available for download at the projects page, where you also can read more about this site and my other projects.

read more