All Changes in 2sxc and EAV v22
Version 22
2sxc v22.01.00 (2026-10-29)
Highlights
- Added a lot more XML Docs for C# APIs (VS Code IntelliSense)
- Major improvement in data Admin UI for lists containing more than 1000 items or many columns
Now the UI will only retrieve the first 1'000 items and only the primary columns, allowing the admin to select what he really wants to load so everything is much faster. - Preparations to support .net
Microsoft.Extensions.Loggingwhen using insights (Beta)
Raw Entity Conversion APIs 🦴
- 🦴 Improve raw to Entity conversion by respecting properties which have the attribute
[ContentTypeField(Type = ValueTypes.Object)]
Bugfixes
- 🐞 Fixed issue saving custom data through API, which sometimes resulted in a DB error because of reuse of DB context
- 🪲 Bug activating / deactivating features - every toggle reloaded the page
- 🪲 Minor bug which prevented view-metadata from being edited
- 🪲 Minor bug searching for features / licenses in Admin-UI
Oqtane 🩸
- 🩸 Ensure that XML Docs are included in distribution
- 🩸 Update ImageFlow 1.13.1 and .net runtimes for that.
- 🩸 Ensure XML docs are included in the distribution.
- 🩸 Shrink Oqtane distribution from ca. 46MB to 30MB thanks to better ImageFlow binaries without debug data.
JavaScript
- Republished npm packages
@2sic/2sxc-typings- https://www.npmjs.com/package/@2sic.com/2sxc-typings - Include typed API for fetch commands where the data posted and retrieved are different
SysData
- Finish migration of SysData and dropped SpawnNew (an old, bad idea)
- Drop almost all cases of
AllowUnknownValueTypesand replace with the content-type attribute - Slim down the code needed for most custom data sources using
overrideand primary constructor.
Internal and Code Hygiene
- Slim down DataSources - move logic to handle
anydata toDataSource16(originally inDataSourceCustom) - Further clean up public APIs to hide APIs which should not be used.
- NPM package for sxc-angular republished with v22, various changes. https://www.npmjs.com/package/@2sic.com/sxc-angular
- Update all .net projects from .net 9 to .net 10 (DNN and Oqtane)
- Improve code for internal
UrlValuesobjects - Replace handling of
IResponseMaker - Split state objects from the factory, such as
IUser,ISite,IModuleetc. - Dramatically improve
ContextOf...incl.ISxcCurrentContextServiceand clarify code paths which prepare and consume. (major) - Improve code structure of permission checkers (composition over inheritance)
- Do composition over inheritance for
XmlExporterand make for functional - Prevent delete app which has shared content-types used by other apps
- Improve Admin-UI when viewing App details, fewer backend calls
- Drop old
SpawnNewconvention (internal)
2sxc v22.00.00 (2026-09-01)
Highlights
- 💃🏼 Models API
- New App Extension vCard
- Linux support for Oqtane
- Container support for Oqtane
- ImageFlow v2.3.1-RC01 now with new
c=x1,y1,x2,y2andc.gravity=x,ycrop option for ImageFlow - see docs - Minimum DNN ☢️ now v10.01.00; .net 4.8 (from 4.7.2)
- Minimum Oqtane ☢️ now v10.02.00 to support multi-language, but we recommend the latest version of Oqtane
Models APIs 💃🏼
The Models API was officially released before, but not really communicated, so we believe it's not used yet. During our first attempts to use it we determined that it needs some more love, so we reworked it. This is kind of a breaking change, but we believe it's not used yet, so it should be safe to do.
- 💃🏼 Introduce
ToModelOptionsfor type-name and null-conversion options - 💃🏼 Standardize exceptions thrown for better diagnostics, incl. missing empty constructor etc.
- 💃🏼 Ensure that interface specs are prioritized to concrete implementations if the interface was used in the
ToModel<I>method - 💃🏼 On interfaces which are used for both models and Raw Data, also respect the
Nameof the[ContentType]attribute - 💃🏼 Change derived class to be on the
IModelFromEntity<Concrete>instead of the[Model...]attribute - 💃🏼 Create / test many combinations of
ToModel/FirstModeletc. - also with/without factory - 💃🏼 Introduced
IFieldSettingsGeneral,IContentTypeDetails,IPaging,IViewConfigurationmodels - 💃🏼🧪 Created ca. 500 unit tests
- 💃🏼📖 Major documentation for models use - still WIP
Raw Entity Conversion APIs 🦴
- 🦴 Created / improved
ContentTypeFromCodegeneration system as it's the foundation of type-names for models - 🦴 also renamed
[ContentTypeSpecs]to[ContentType]and introduced[ContentTypeUse]for referencing other content-types - 🦴 Changed base object
RawEntityto be a record 🦴 Created fallbackRawEntityClassicfor class based data - not sure if we'll keep this though- 🦴 Reworked Object-To Dictionary APIs to reduce the code needed
- 🦴 Major rework in general...
- 🦴🧪 Created ca. 400 unit tests
- 🦴📖 Documentation for this Coded Content-Type Definitions new v22 / Coded Data Creation of Entities WIP v22
Other
- ⚠️ a vCard API extension was removed. We believe it has never been used since v20 where the folders changed, so we don't think this will affect anyone.
- In addition, a new/separate App Extension vCard was created, which is a much better implementation of the same idea.
- An internal
GetOnce<T>API was changed to beLazyGet<T>
Copilot Enhancements ✈️
- ✈️ Data Copilot should not generate Ephemeral fields
- ✈️ Data Copilot better detects entity-fields and the expected data type within
- ✈️ Data Copilot auto-generate models on changes (WIP / BETA) - ATM for changes in ContentType (like name) and for changes in field names
App Enhancements
- Changed all apps to build with Vite
Bugfixes
- 🪲
MailServicethrew exception when not providing attachments - 🪲 Compiling code fails to pick up config.json on the fly, so installing Radmin doesn't work until restart
- 🪲 Bug exporting apps with very long names
- 🪲 Quick-Dialog had timing issues, so it sometimes didn't appear as expected
Toolbars
- ✏️ Toolbars opening the edit dialog for only an entity-field works now
- ✏️ Toolbars targeting a entity-field for add-new can now specify the content-type to use for the new entity (
New(contentType: '...')) - ✏️ Improve icon assignment - especially for entity-fields with multiple target types to pick up the right one from the configurations
DNN ☢️
- Performance improvements loading Razor; we discovered a piece of code reviewing all registered assemblies during page load which we could reduce to once per system start.
Oqtane 🩸
- 🩸 Support the new Multi-Language system of Oqtane (note that it's still very buggy, because the Oqtane implementation is buggy)
- 🩸 Improve ImageFlow in edge cases
- 🩸 Introduce Linux support (and test on Linux), preparing for container use as well and multi-DB
Side effect: Oqtane distribution is now ca. 30MB larger, because it contains all variants of the native DLLs. As soon as the Marketplace supports it, we'll create a separate package for Linux and MacOS. - 🩸 Introduce multi-DB support for Postgres, MySQL and SqlLite
SysData
This is about changing how most of our internal APIs work. To make them more flexible, we're changing most of them to use DataSources. This is the list of systems which we changed, but there are way more as we can't list every one.
- Apps
- ZoneApps
- AppLanguages
- SiteLanguages
- ZoneLanguages
- SystemInfo
- Fields
- InputTypes
- ReservedNames
- SharedFields
- Ancestors
- Descendants
- InheritableApps
- AppStatistics
- Scopes
- AppEnhancements
- AppSettings
- AppResources
- AppSettingFields
- AppResourceFields
- AppMetadata
- GetEntitiesForAdmin
- AppWebApiControllers
- AppWebApiControllerDetails
- AppWebApiControllerEndpoints
- ContentTypeDetails
Internal and Code Hygiene
- Entity Framework: Disabled MARS (Multiple Action Result Sets)
- EAV UI: Upgrade to Angular 22
- Quick-Dialog: Upgrade to Angular 22
- Improve handling of git dependabot requests
- Various unit tests in the
$2sxcui using Vitest - Refactor import/export code
- Change build of all JS projects to Vite and ESBuild;
$2sxc,inpage,quick-dialog,eav-uiand more - Updated ImageFlow from v2.1.0-RC11 to v2.3.1-RC01
- Added docs for targeted SQL delete operations
Breaking Changes in EAV and 2sxc v22.00
- ⚠️ Minimum DNN ☢️ now v10.00.00; .net 4.8 (from 4.7.2)
- ⚠️ Minimum Oqtane ☢️ now v10.02.00 but we recommend the latest version of Oqtane
If you did, you can use the new
IEntityFieldinterface instead, which is very similar to the oldIFieldinterface. - 🛑 We dropped a very old object
_2sxcEditInformationwhich was on some JSON when serializing entities in edit mode
This was deprecated in v9, but there may still be some JS around relying on this.
If you run into issues, please contact us so we can help. - ⬇️ a vCard API extension was removed. We believe it has never been used since v20 where the folders changed, so we don't think this will affect anyone.
- ⬇️ The interface
IContentTypeAttributewas renamed toIContentTypeField.
This is an internal API but was used once inRadmin, so for compatibility we're keeping the old interface for a while but will update the extension. - ⬇️ An internal
GetOnce<T>API was changed to beLazyGet<T> - ⬇️ Some internal
Fieldsetters forUrl,RawandValuewere removed as they should not be used. - ⬇️ The internal base class for dependencies
ToSic.Sys.Services.DependenciesBasewas changed to be arecord(previously it was aclass) - ⬇️ The internal
PiggyBacksystem was simplified. - ⬇️🩸 Oqtane: Removed old Razor APIs
GetCode()andCreateInstance()which were probably never used on Oqtane
You should only be affected, if you were a very early adopter and used some of the earliest template Apps. If so, please reach out. - ⬇️ Extensions in the very old folder
/systemwere deprecated in v20, but it seems we missed some cases, so it may still have worked. It's now fully removed.
Breaking Changes in v22
We marked the breaking changes like this
- ⚠️ things which may affect you
- ⬇️ things which are extremely unlikely to affect you
Breaking Changes in EAV and 2sxc v22.00
Breaking Changes in EAV and 2sxc v22.00
- ⚠️ Minimum DNN ☢️ now v10.00.00; .net 4.8 (from 4.7.2)
- ⚠️ Minimum Oqtane ☢️ now v10.02.00 but we recommend the latest version of Oqtane
If you did, you can use the new
IEntityFieldinterface instead, which is very similar to the oldIFieldinterface. - 🛑 We dropped a very old object
_2sxcEditInformationwhich was on some JSON when serializing entities in edit mode
This was deprecated in v9, but there may still be some JS around relying on this.
If you run into issues, please contact us so we can help. - ⬇️ a vCard API extension was removed. We believe it has never been used since v20 where the folders changed, so we don't think this will affect anyone.
- ⬇️ The interface
IContentTypeAttributewas renamed toIContentTypeField.
This is an internal API but was used once inRadmin, so for compatibility we're keeping the old interface for a while but will update the extension. - ⬇️ An internal
GetOnce<T>API was changed to beLazyGet<T> - ⬇️ Some internal
Fieldsetters forUrl,RawandValuewere removed as they should not be used. - ⬇️ The internal base class for dependencies
ToSic.Sys.Services.DependenciesBasewas changed to be arecord(previously it was aclass) - ⬇️ The internal
PiggyBacksystem was simplified. - ⬇️🩸 Oqtane: Removed old Razor APIs
GetCode()andCreateInstance()which were probably never used on Oqtane
You should only be affected, if you were a very early adopter and used some of the earliest template Apps. If so, please reach out. - ⬇️ Extensions in the very old folder
/systemwere deprecated in v20, but it seems we missed some cases, so it may still have worked. It's now fully removed.