-
Couldn't load subscription status.
- Fork 354
Breaking changes in 6.0
- Upgraded target framework from .NET Standard 2.0 to 2.1, effectively dropping support for .NET Framework and UWP
- Added nullability annotations to all properties. Depending on how you treat warnings, this might cause compile errors.
- Moved datatypes
Address,Duration,HumanNameandRatiointo Base, so they are now shareable across FHIR versions. This also means they can no longer be found in the specific sattellite (STU3, R4 etc) assemblies. - Removed support for binary serialization.
- Made all
ReflectionHelpermethods internal - this was always meant as a set of utility methods for our own use. - Removed the
IDeepCopyableinterface, which was previously implemented on our POCOs. Its methods are now accessible via extensions. - Removed
IsResourcefrom theFhirTypeAttribute. One can just check against theResourcesubtype instead. - Renamed the
IsNestedTypeparameter onFhirTypeAttributetoIsBackboneTypeto align with common FHIR jargon. - Removed the
BackboneTypeAttributeclass. One can useIsBackboneType(above), the type's name (that was in this attribute) is now the ClassMapping.Name. - Removed the
DefinitionPathproperty ofClassMapping, since it is the same as theClassMapping.Namefor backbone types. - POCO's no longer implement
IDictionary<string,object>. Although this sounded like a good idea, it did break frameworks and made the debuggers display resoures as dictionaries. The interface is also not enough to base serializers or validators on, so it's use is limited. Therefore, we decided to remove it. You can now useEnumerateElements()instead, or functions likeTryGetValue()andSetValueand the indexer ([]). - Since we now have a standard way to dynamically navigate a POCO, we removed
Base.ChildrenandBase.NamedChildrenproperties, since these have overlapping functionalities. Note that there is an extension methodChildren()(obsolete) that you can use for backwards-compatibility. - The type of
ElementDefinition.Constraint.RequirementsElement,ElementDefinition.Binding.DescriptionElement,ElementDefinition.Mapping.CommentElementandCapabilityStatement.Implementation.DescriptionElementhave changed fromMarkdowntoPrimitiveType. Set this property toMarkdownto get the original behaviour. This change allows you to use the correct type depending on the version of FHIR you are writing against (which matters in e.g. FhirPath expressions that match against type). - The type of
Attachment.SizeElementhas changed fromInteger64toPrimitiveType. Set this property toInteger64to get the original behaviour, but you should now assign the correct type (i.e.UnsignedIntegerbefore R5) depending on the version of FHIR you are writing against. - The type of
Bundle.Link.RelationElementhas changed fromFhirStringtoPrimitiveType. Set this property toInteger64to get the original behaviour, but you can now use the correct type depending on the version of FHIR you are writing against. - The type of
Meta.ProfileElementhas changed fromCanonicaltoCode. Set this property toInteger64to get the original behaviour, but you can now use the correct type depending on the version of FHIR you are writing against. - Each of the above elements no have multiple helper properties (e.g. Attachment.Size and Attachment.SizeUnsignedInteger) to allow you to use "simple assignments" of primitives.
-
IAnnotatablenow inheritsIAnnotated, so implementers of the former will have to implement the latter. Which makes sense, since objects that can be annotated should provide support for reading those annotations too. -
Resource.HasVersionIdhas been removed as part of a clean up of the public interface ofResource. Just checkResource.VersionIdfor null. -
Resource.SyncLockhas been removed, as this is not a responsibility forResource, and lock objects will change in .NET 9. - The
IDeepComparableinterface has disappeared, theMatches()andIsExactly()functions now simply take aBaseas parameter. Also, it is now possible to write new custom comparison operations using the newCompareChildren()function, given a custom implementation ofIEqualityComparer<T>. - The
[Bindable]attribute has been removed in favor of the more usefulICoded. So, if you want to determine whether a datatype can be bound to, you can check forICoded, and then call its members to get to a coded representation of that datatype. This is also true for Resources, though that is normally only used in the context of CQL. -
ISystemAndCodehas been removed. It was only used onCode<T>.Code<T>now inherits from Code, and we have added aLiteralandSystemproperty toCodeto polymorphically access those values. Also both implement the equivalent (but more general)ICodedinterface. -
FhirDateTime.TryToDateTimehas been renamed toFhirDateTime.TryToSystemDateTimeto make it clear what the output is. -
Time.TryToTimehas been renamed toTime.TryToSystemTimeto make it clear what the output is. -
Date.TryToDatehas been renamed toDate.TryToSystemDateto make it clear what the output is. -
Any.TryParse()turned out to be both confusing in its use and a bit too specific to be useful generally and has been removed. We introducedAny.TryParseToAny()to replace it. -
ICqlConvertibledid follow Microsoft's example, by listing tons ofTryConvertToXXX()methods, but it turned out that it was hard to use this way. It has been replaced byAny.TryConvertTo(), which has a parameter with the desired target type. - Many methods in the
ElementModel.Typesnamespace used our ownResult<T>, which is common in functional languages, but not idiomatic for C# developers, so we replaced the functions returningResult<T>with "normal"TryXXXXXmethods (e.g.TryConvertTo()) returning bool and anoutparameter. We will revisit when Microsoft introduces discriminated unions and standard types for this purpose. - For some System/CQL types, we previously had parameterless constructors that assumed a default (e.g. the empty string for Types.String) - this was unexpected and they have been removed. These types will require you to have a value for the string (or boolean, etc).
- We removed the operators for Quantity multiplication, division, addition and substraction, since these implementations were wrong or at least simplistic. These operations need to be done using a real unit and precision aware library, which we might add later. This also means FhirPath support for these operations has been removed for now.
- FHIR Time, Instant, Date and FhirDateTime POCO comparison operators have been removed, they just forwarded the comparison to the equivalent CQL Date type. Instead, call
ConvertToSystemDate()and invoke the comparisons on the CQL/system Date. - FHIR Time no longer accepts a timezone in its literal, this was never allowed in the FHIR spec.
- The
ElementValueclass was no longer used by the SDK and has been removed. - The conversion operator from .NET primitive types (like boolean and string) to CQL/System primitives have been made explicit to avoid surprises.
- The Equals()/GetHashCode() and == and != operators have been removed from the primitive datatype POCO's, since these POCO's are mutable and really not "record" like. E.g. mutating the value of a primitive after putting it in a Dictionary would result in unexpected behaviour (as documented by Microsoft). Hence, we decided to treat them as reference types. You can, however, use the
TryConvertXXX()functions to turn them into (unmutable) FhirPath types and then use the comparisons and equality on those. - Only POCO's that can be validated are implementing
IValidatableObject, whereas previously, all resources had a default implementation (mostly returning[]). - Most extension methods on the data models (most notably, serialization and conversions) have been moved to more central locations. For some extension methods, this means their namespace has changed.
- All such extensions on ITypedElement/ISourceNode-based classes have been moved to the
Hl7.Fhir.ElementModelnamespace. - All such extensions on POCO-based classes have been moved to the
Hl7.Fhir.Modelnamespace.
- All such extensions on ITypedElement/ISourceNode-based classes have been moved to the
- The extension methods for conversions between Base and ITypedElement for a specific FHIR version have been unified under
Hl7.Fhir.ElementModel.VersionedConversionExtensions. - The class
FilterPredicateExtensionshas been renamed toCodedExceptionFiltersto better match the purpose of the class. - WebResolver/CommonWebResolver do not have properties to configure the underlying default client anymore, pass a factory method to a configured client to the constructor instead.
- FhirBoolean/Integer/Decimal do not use a string in their ObjectValue/JsonValue members, as they represent their contents using the normal boolean, integer and decimal native type. We have therefore removed the
IsValidValue()function from these classes as they are not relevant for the operation of these types. -
SearchParameterDefinitionmoved toBase, so it is no longer a nested class underModelInfo, but a top-level class. - PropertyMapping's
GetValueandSetValueare gone, as we no longer use these in the parsers/serializers to retrieve a property's data, instead we always use the newBase.TryGetValueandBase.SetValueinstead. This also means the code to dynamically generate these setters (PropertyInfoExtensions.GetValueSetter, PropertyInfoExtensions.GetValueGetter) has been removed. - We have removed having a global (static) cache of ClassMappings that was used within
ClassMapping, soClassMapping.TryGetMappingForType()andClear()have been removed and ClassMapping.TryCreate() will no longer return singletons, but truly create a new ClassMapping instead. The reason for this is that, as we are working towards users being able to customize classmappings, it is necessary that ClassMappings are "owned" by aModelInspector, soModelInspectorwill be "the cache" for the classmappings in that inspector. If we would have allowed changing or customizing ClassMappings based on a global cache, the classmappings would change in the global cache and thus for the whole application, which is not always intended. This is also the reason thatTryCreatenow takes aModelInspectoras a parameter, as this will become its owning parent. Also,ClassMappingnow has aModelInspectorproperty, which points back to the owning ModelInspector - a very useful feature to have.
- Since the POCO's ObjectValue now captures strings for base64, long and instant, the parsers no longer need to validate and parse the literals, but instead will put them directly into the POCO's. This means that the validation for these types (and thus, now all types) have been moved to the POCO's. The errors from
FhirXmlExceptionandFhirJsonExceptionthat were raised by these validation (INCORRECT_BASE64_DATA, _CANNOT_BE_PARSED, _INCORRECT_FORMAT, _LITERAL_INVALID) have been replaced with errors from theCodedValidationException(INVALID_BASE64_VALUE_CODE, INCORRECT_LITERAL_VALUE_TYPE_CODE, LITERAL_INVALID_CODE). -
FhirXmlPocoDeserializerSettings.DisableBase64DecodingandFhirJsonConverterOptions.DisableBase64Decodinghave been removed, since the parser will no longer decode base64 data at all (this is now done in the POCO, deferred until the moment it is needed). - The parser will set the values for properties and ObjectValue before calling the methods provided in
IDeserializationValidator. These methods can therefore no longer mutate their arguments, the arguments are no longer "by ref".ValidatePropertyis also no longer called for theValueproperty of primitives, since the validation of these values are deferred to the POCO's themselves. -
DataAnnotationDeserialzationValidator.NarrativeValidationhas been moved to theFhirJsonConverterOptionsand theFhirXmlPocoDeserializerSettings. Not only was this option too hard to find, but also logically it is an option of validation, not an option of the validator. In other words, all implementations ofIDeserializationValidatorshould deal with this option, not just this specific implementation. -
BaseFhirParserhas gone, and so are its parse methods to "parse" anITypedElementorISourceNodeto a POCO. UseToPoco<T>()instead on theITypedElementorISourceNode. The same applies to FhirXmlParser and FhirJsonParser. - The serializers do not have constructors taking an
Assemblyanymore, they will useModelInspectorinstead (like all other version-agnostic parts of the SDK). Replace the parameter in these calls withModelInspector.ForType(typeof(Patient))orModelInspector.ForAssembly()instead. -
FhirXmlPocoDeserializerSettingshas been changed to arecordinstead of aclass, to align with our best practices for settings classes used in other parts of the SDK. -
PrimitiveParseHandlerwas not used anymore by the SDK and has been removed. - The enum
DeserializerModeshas been renamed toDeserializationMode. - Exception filtering has moved from the engines to the parsers, so
FhirSerializationEngineFactory.Custom()does not accept a filter parameter anymore, you will have to configure the xml/json settings you are passing in to the call toCustom(). -
ParserSettingshave been renamed toDeserializerSettingsto reflect the name change of the parsers to "deserializers". -
ParserSettings.TruncateDateTimeToDatehas been removed. It was a fix for a historic bug, which should not appear anymore. This functionality can be reproduced, if necessary, by exploiting theValidatorproperty in FhirJsonConverterOptions/FhirXmlPocoDeserializerSettings. This will allow you to get a callback when a parsed object is validated. At this moment, you can manipulate the data as well, e.g. when validating aFhirDateTime. -
ParserSettings.ExceptionHandlerhas been removed. Since the FhirXmlParser/FhirJsonParser now use the newer technology used by FhirXml/JsonPocoDeserializer, and not the ITypedElement-based parsers anymore, there are no more callbacks on errors. Instead, these new parsers will allow you to get a full list of exceptions after parsing is done. - The
ParserSettingshad a settingDisallowXsiAttributesOnRootwhich wasfalseby default. In the new parser implementation, this istrueby default, and as such it has been renamed toAllowXsiAttributesOnRoot, to make sure that all "defaults" are false/null/0 etc. - The
ParserSettingshadPermissiveParsingset to true by default, this has been changed tofalse, to align with the behaviour of all newer parsers (including the ITypedElement-based ones) to be strict by default. - The class
DeserializerSettings(formerlyParserSettings) is now a record, so its properties are readonly be default. Also, the cloning constructor and operation have been removed, use the built-in features of C# dealing with records instead. - The
FhirJsonParser.Parsetaking aJsonReader(from Newtonsoft) have been removed since the new parsers useUtf8JsonReaderinstead. - The deserlializer inheritance structure has been simplified, since there is no longer an "old" and "new" deserializer, and now looks like this:
classDiagram
BaseFhirXmlDeserializer <|-- FhirXmlDeserializer
FhirXmlDeserializer <|-- FhirXmlParser
BaseFhirXmlDeserializer <|-- BaseFhirXmlPocoDeserializer
BaseFhirXmlPocoDeserializer <|-- FhirXmlPocoDeserializer
DeserializerSettings <|-- ParserSettings
DeserializerSettings <|-- FhirJsonConverterOptions
DeserializerSettings <|-- FhirXmlPocoDeserializerSettings
class FhirXmlParser{
<< Obsolete >>
}
class BaseFhirXmlPocoDeserializer{
<< Obsolete >>
}
class FhirXmlPocoDeserializer{
<< Obsolete >>
}
class FhirXmlPocoDeserializerSettings{
<< Obsolete >>
}
class ParserSettings{
<< Obsolete >>
}
As is visible here, the existing FhirXml/JsonParser and FhirXml/JsonPocoDeserializer have been unified in FhirXml/JsonDeserializer. Note that the ITypedElement-based parsers (XmlNode and JsonNode) are unchanged.
All the settings classes for serializers (FhirJson/XmlSerializationSettings, SerializerSettings, FhirJsonPocoSerializerSettings) have been taken out:
- Pretty printing is not a configuration, but has returned as a parameter to serialization functions that produce a string or bytearray.
- There is no longer a way to throw an exception if the serializer encounters an unknown element: this kind of "validation" is part of the parser and validator, and felt rather out of place in the serializer (which, by design, does not do any other kind of validation).
- Summary filters can be passed as arguments to the serialization functions, since they are not a constant configuration option for a serializer, as the kind of summarization may vary from call to call to the serializer. This also meant removing the
IncludeMandatoryElementsInSummarysetting, as this should now be controlled by constructing a summary filter usingSerializationFilter.ForSummary(), which has a parameter to control this setting. This filter is then passed as an argument to the serializer calls (or as an option toForFhir()). - The ability to control trimming whitespace in XML values has been removed since the FHIR specification demands whitespace is always trimmed.
- Most async versions of the serializers have been removed since we are using
XmlWriterfor Xml and have switched from Newtonsoft toSystem.Text.Json.Utf8JsonWriterinternally, all of which have no support for async. - When configuring the
System.Text.Jsonstack withForFhir(), you no longer have to pass in separate serializer and deserializer option structures, they have both been combined into a singleFhirJsonConverterOptions. This means you no longer have overloads using FhirJsonPocoDeserializerSettings. - The
BaseFhirPocoXml/JsonSerializertook aFhirReleaseas a constructor argument, while all other multi-version classes (like BaseFhirClient) took aModelInspector. We have made this consistent by letting the serializers have aModelInspectorargument. - The abstract base for all serializers,
BaseFhirSerializerwas not truely a useful baseclass for anything, it just contained some protected re-usable functions, that we have turned into (internal) extension methods. As part of cleaning up the deserializers and serializers, this class has been removed. - The new serializers implement stricter rules on encoding of special characters. While not a breaking change per se (the json is semantically equivalent after all), a character-by-character comparison of the outputs will not necessarily be the same (e.g. the
+in timezones is being escaped). This is because we are using System.Text.Json's default encoder, not UnsafeRelaxedJsonEscaping. - Since we have combined the existing APIs of FhirXml/JsonSerializer and FhirXml/JsonPocoSerializer, we had to make the
SummaryTypeparameter mandatory, to avoid ambiguous overloads. Similarly, we have renamed the optionalrootparameter for the XML serialization functions torootNamefor consistency. - The serializer inheritance structure has been simplified, since there is no longer an "old" and "new" serializer, and now looks like this:
classDiagram
BaseFhirXmlSerializer <|-- FhirXmlSerializer
BaseFhirXmlSerializer <|-- BaseFhirXmlPocoSerializer
BaseFhirXmlPocoSerializer <|-- FhirXmlPocoSerializer
class BaseFhirXmlSerializer{
}
class FhirXmlSerializer{
}
class BaseFhirXmlPocoSerializer{
<< Obsolete >>
}
class FhirXmlPocoSerializer{
<< Obsolete >>
}
Note that the "new" serializers are marked 'Obsolete', this is because their functionality has been moved to what used to be the old serializers (BaseFhirXmlSerializer/FhirXmlSerializer), so the obsolete messages will indicate that a rename is in place.
The FhirPath engine has been refactored to work against PocoNode instead of ITypedElement. As such, all the internal FP signatures have had their argument/return types changed from ITE to PocoNode. Note that PocoNode implements ITypedElement, so in most cases this should be compile-compatible.
- Changed many of the signature-declared types in internal FhirPath engine methods from ITypedElement to PocoNode
- Removed methods which became obsolete due to this change. Most notably
ToFhirPathResolver
We have revised the validation attributes placed on properties in the POCOs. Until now, we have used the System.ComponentModel.DataAnnotations validation attributes to validate the POCO's, but with the introduction of overflow (more incorrect data fitting in the POCO), many of these attributes would throw on invalid values rather than report something useful. Additionally, the attribute validation was a separate codepath from the validation run by the parsers, so running attribute validation (through Validator.TryValidate()) on an object after parsing would return different errors than returned by the parsers (or throw).
To remedy this situation, we have completely replaced attribute validation by a new native POCO validator, which can be invoked by calling Validate() on any of the POCOs, and which will return zero or more CodedValidationExceptions, just like the parsers. Since this validator uses the same code as the parsers, it is guaranteed to give the same errors (except, obviously, for json/xml specific errors, which can only be detected while parsing).
The major resulting breaking changes are:
- Removal of all the
xxxPatternAttributes (likeStringPattern) since they are no longer in use. - Remaining validation attributes no longer derive from
System.ComponentModel.DataAnnotations.ValidationAttribute. - Since the deserializers and the validators are aligned, we renamed the
IDeserializationValidatorinterface toIPocoValidator(which changes the type ofDeserializerSettings.Validator), DataAnnotationDeserialzationValidator (an implementation ofIDeserializationValidator) is now calledFhirAttributeValidator(an implementation ofIPocoValidator) - The
PropertyDeserializationContextandInstanceDeserializationContexthave been unified, and all use ofDataAnnotation.ValidationContexthas been removed, so the extensions setting and manipulatingValidationContextare gone too. - The
DeclaredTypeAttributehas been unified withAllowedTypes, they are both representing information about the actually allowed types. - Removed
PropertyMapping.GetValue()andPropertyMapping.SetValue(): we no longer use codegeneration for dynamic setters and getters, as this can now be done with the newBase.TryGetValue()andBase.TrySetValue().
-
ArtifactSummaryGenerator.Defaulthas been removed, the constructor should be used instead. - Most synchronous versions of async extension methods on
FhirClienthave been removed. Those methods were just wrapping async calls, so the recommendation is to useAsyncversion instead. -
FhirClient.ExpandValueSetandFhirClient.ValidateCodehave been marked as obsolete, async versions are recommended instead. -
ClassMapping.IsNestedTypehas been removed,ClassMapping.IsBackboneTypeshould be used to align with FHIR jargon. -
VERSION_CONTENT_HEADERhas been removed,VERSION_CONTENT_HEADER_NAMEshould be used instead. -
ElementDefinition.Namehas been removed,ElementDefinition.SliceNameshould be used instead. -
FhirClientSettings.PreferredReturnhas been removed,FhirClientSettings.ReturnPreferenceand/orFhirClientSettings.UseAsyncinstead. -
FhirClientSettings.CompressRequestBodyhas been removed,FhirClientSettings.RequestBodyCompressionMethodinstead. -
FhirXmlException.ENCOUNTERED_DTP_REFERENCES_CODEhas been removed as it had a typo,FhirXmlException.ENCOUNTERED_DTD_REFERENCES_CODEshould be used instead. - Multiple constructors for
FhirJsonPocoDeserializershave been removed, the default constructor should be used if a single version of FHIR is user, otherwiseBaseFhirJsonPocoDeserializershould be used instead. - Multiple constructors for
FhirXmlPocoDeserializerhave been removed, the default constructor should be used if a single version of FHIR is user, otherwiseBaseFhirXmlPocoDeserializershould be used instead. -
HttpUtil.Preferhas been removed,HttpUtil.ReturnPreferenceshould be used instead. -
Lexer.Quantityhas been removed as it's no longer used byFhirPathparser. -
SearchParamDefinition.ComposityParamshas been removed,SearchParamDefinition.Componentshould be used instead. -
Element.RemoveAllConstrainedByDiffExtensionsandIEnumerable<T>.RemoveAllConstrainedByDiffExtensionsextensions have been removed,RemoveAllNonInheritableExtensionsshould be used instead. -
TransactionBuilder.Create,TransactionBuilder.Update,TransactionBuilder.Patch,TransactionBuilder.Deletehave been removed, theConditionalCreate/ConditionalUpdate/ConditionalPatch/ConditionalDeleteSingleshould be used instead. -
ValidateEnumCodeAttributehas been removed,CodePatternAttributeshould be used instead. -
ValueSet.Definehas been removed, the property has been renamed inDSTU2standard and moved out inDSTU3. -
ValueSetExpander.Expandhas been removed, the asynchronous version should be used instead. -
ZipSource.Sourcehas been removed, theZipSourceimplements theIConformanceSourceso should be used directly.
- We have archived the
Fhir.Metricslibrary. This means thatTypes/Quantityno longer supports UCUM unit conversion. Comparing units will now only succeed if the units are equivalent, at which point they are compared by value. -
Narrative.divandNarrative.statusare no longer in-summary (to reflect corrections made to this effect in the FHIR spec). This will result in a different rendering of resources when generating summaries. -
Code<T>is now a subclass ofCode, which means you only have to check againstCodeto know you're dealing with a code. TheValueproperty returns astringwhen treating it as aCode, and will return an enum value otherwise. This change in hierarchy means that the order of type matches may be influenced, checking aCode<T>againstCodewas not a match before, but is now. Note that the single value inCode<T>actually has an implicit code and system that are defined for that code, so conceptuallyCode<T>is more like aCoding. - Accessing the
Valueproperty and most other methods onPrimitiveTypewill now throw a relevantCodedValidationExceptioninstead of generic InvalidCast/FormatException/InvalidOperation exceptions when itsObjectValueis incorrect. -
ICoded.ToCodings()now returns anIReadOnlyCollection<Coding>instead of anIEnumerable<Codeing>. Since the implementations are all based on the standard list properties, it's more clear and efficient for us to actually indicate that the enumerables are in fact lists.
- Parameters.this[] has been removed in favor of a (future) use of this operator on the base, e.g. for dynamic access to elements. You can use the existing (and equivalent)
GetSingle()instead. -
ReflectionHelper.IsTypedCollection(System.Type)has been renamed toReflectionHelper.IsTypedList(System.Type)since checking againstICollection<T>is not sufficient anymore to determine whether an element's type is a List, so we check againstIList<T>instead. - The type of
FhirEvaluationContext.TerminologyServicehas been changed fromITerminologyServicetoICodeValidationTerminologyService. For most users, this should not be breaking. - The
WithResourceOverridesstatic method introduced in 5.10 is now an extension method (and will need to be called on an instance). This allows subclasses to inherit it without implementing it themselves. - Moved
ScopedNodeExtensionsfrom theElementModelnamespace to theModelnamespace. ImportHl7.Fhir.Modelwhen using methods likeResolve() - The type of
FhirEvaluationContext.ElementResolverhas been changed fromFunc<string, ITypedElement>toFunc<string, IScopedNode>. External resolvers should make sure to return a scoped node. - The
DefaultModelFactoryhas been removed. It had not been in use for years, except by our own tests. With the cleanup of the PocoBuilder (ITypedElement->POCO) infrastructure, we decided to remove this class. -
CitedArtifactContributorshipSummaryComponenthas been renamed to the more correctContributorshipSummaryComponent. - PropertyDeserializationContext and ObjectDeserializationContext have had their Path properties changed to be able to delay producing a path from a PathStack.
- We had three classes dealing with Canonical across our software, and combined into one single class, the existing
CanonicalPOCO. As part of this,CanonicalUriForFhirCoreType()has been renamed toForCoreType(). - Removed
CqlTypeSpecifierfromEnumMapping, since this is too specific for Cql, and can be done in the CQL SDK instead. -
ToScopedNodeonITypedElementis now marked Obsolete/Experimental, to prompt a check for a common patters.ToTypedElement().ToScopedNode()that will now have different behaviour and potentially unintended performance hit. Should be usingToTypedElementLegacy()and then the warning can be ignored, butToPocoNode()is also better alternative when possible.