Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Null Object Reference - DeepClone #209

Closed
vsederburg opened this issue Mar 9, 2021 · 16 comments
Closed

Null Object Reference - DeepClone #209

vsederburg opened this issue Mar 9, 2021 · 16 comments
Assignees
Labels

Comments

@vsederburg
Copy link

I'm getting an error using Mapper.DeepClone to clone a class. This was working sometime in the past few weeks, so I'm not sure what has changed. I'm using the current Mapper version 1.7.2 via nuGet.

I seem to remember at one point there was a problem cloning an object that included a dictionary, but I think that was fixed.

I've attached the class and base class that I'm trying to clone. Let me know if I can provide any other information.

Thank you!

This is the error:

System.NullReferenceException: Object reference not set to an instance of an object.
at AgileObjects.AgileMapper.Members.QualifiedMember.Append(Member childMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.GetNonEnumerableChildMember(QualifiedMember parentMember, Member childMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.TargetMemberEverRepeatsWithin(QualifiedMember parentMember, IQualifiedMember subjectMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.TargetMemberEverRepeatsWithin(QualifiedMember parentMember, IQualifiedMember subjectMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.TargetMemberEverRepeatsWithin(QualifiedMember parentMember, IQualifiedMember subjectMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.TargetMemberEverRepeatsWithin(QualifiedMember parentMember, IQualifiedMember subjectMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.TargetMemberEverRepeatsWithin(QualifiedMember parentMember, IQualifiedMember subjectMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.TargetMemberEverRepeatsWithin(QualifiedMember parentMember, IQualifiedMember subjectMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.TargetMemberEverRepeatsWithin(QualifiedMember parentMember, IQualifiedMember subjectMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.TargetMemberEverRepeatsWithin(QualifiedMember parentMember, IQualifiedMember subjectMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.TargetMemberEverRepeatsWithin(QualifiedMember parentMember, IQualifiedMember subjectMember)
at AgileObjects.AgileMapper.Members.MemberMapperDataExtensions.IsRepeatMapping(IQualifiedMemberContext context)
at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperData.get_IsRepeatMapping()
at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperData.IsNotTargetTypeFirstMapping(ObjectMapperData parent)
at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperData..ctor(IMappingContext mappingContext, IQualifiedMember sourceMember, QualifiedMember targetMember, Nullable1 dataSourceIndex, ObjectMapperData declaredTypeMapperData, ObjectMapperData parent, Boolean isForStandaloneMapping) at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperData.For[TSource,TTarget](ObjectMappingData2 mappingData)
at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData2.get_MapperData() at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetChildMapping(IObjectMappingData childMappingData, MappingValues mappingValues, ObjectMapperData declaredTypeMapperData) at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetChildMapping(IQualifiedMember sourceMember, Expression sourceMemberAccess, Int32 dataSourceIndex, IChildMemberMappingData childMappingData) at AgileObjects.AgileMapper.DataSources.EnumerableDataSource.GetMapping(IDataSource sourceEnumerableDataSource, Int32 dataSourceIndex, IChildMemberMappingData enumerableMappingData) at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.GetFinalDataSource(IDataSource foundDataSource, IChildMemberMappingData mappingData) at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.GetSourceMemberDataSource() at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.get_MatchingSourceMemberDataSource() at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.UseSourceMemberDataSource() at AgileObjects.AgileMapper.DataSources.Factories.SourceMemberDataSourcesFactory.<Create>d__0.MoveNext() at AgileObjects.AgileMapper.DataSources.Factories.MemberDataSourceSetFactory.<EnumerateDataSources>d__2.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source)
at AgileObjects.AgileMapper.DataSources.Factories.MemberDataSourceSetFactory.CreateFor(DataSourceFindContext findContext)
at AgileObjects.AgileMapper.Members.Population.MemberPopulatorFactory.Create(MemberPopulationContext context)
at AgileObjects.AgileMapper.Members.Population.MemberPopulatorFactory.<>c.b__3_0(MemberPopulationContext ctx, QualifiedMember tm)
at AgileObjects.AgileMapper.Extensions.PublicEnumerableExtensions.d__13.MoveNext() at AgileObjects.AgileMapper.Extensions.PublicEnumerableExtensions.<Filter>d__42.MoveNext()
at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.PopulationExpressionFactoryBase.d__3.MoveNext()
at System.Collections.Generic.List1..ctor(IEnumerable1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.PopulationExpressionFactoryBase.AddPopulation(MappingCreationContext context) at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeMappingExpressionFactory.AddObjectPopulation(MappingCreationContext context) at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.<AddPopulationsAndCallbacks>b__11_0(MappingExpressionFactoryBase factory, MappingCreationContext ctx) at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.AddPopulationsAndCallbacks[TArg](TArg argument, MappingCreationContext context, Action2 mappingBodyPopulator)
at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.AddPopulationsAndCallbacks(MappingCreationContext context)
at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.Create(IObjectMappingData mappingData)
at AgileObjects.AgileMapper.DataSources.ComplexTypeDataSource.Create(IObjectMappingData mappingData)
at AgileObjects.AgileMapper.DataSources.Factories.Mapping.ComplexTypeMappingDataSourceFactory.CreateFor(IObjectMappingData mappingData)
at AgileObjects.AgileMapper.DataSources.Factories.Mapping.MappingDataSourceSetFactory.CreateFor(IObjectMappingData mappingData)
at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperFactory.Create[TSource,TTarget](ObjectMappingData2 mappingData) at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData2.GetOrCreateMapper()
at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetInlineMappingBlock(IObjectMappingData mappingData, MappingValues mappingValues, CreateMappingDataCallFactory createMappingDataCallFactory)
at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetElementMapping(IObjectMappingData elementMappingData, Expression sourceElementValue, Expression targetElementValue)
at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetElementMapping(Expression sourceElementValue, Expression targetElementValue, IObjectMappingData mappingData)
at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.EnumerablePopulationBuilder.GetElementConversion(Expression sourceElement, IObjectMappingData enumerableMappingData)
at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.Looping.IndexedSourcePopulationLoopData.GetElementMapping(IObjectMappingData enumerableMappingData)
at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.EnumerablePopulationBuilder.GetElementPopulation(IPopulationLoopData loopData, IObjectMappingData enumerableMappingData)
at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.Looping.PopulationLoopDataExtensions.BuildPopulationLoop[TLoopData](TLoopData loopData, EnumerablePopulationBuilder builder, IObjectMappingData mappingData, Func3 elementPopulationFactory) at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.EnumerablePopulationBuilder.BuildPopulationLoop(Func3 elementPopulationFactory, IObjectMappingData mappingData)
at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.EnumerablePopulationBuilder.AddNewItemsToTargetVariable(IObjectMappingData enumerableMappingData)
at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.CopySourceEnumerablePopulationStrategy.Create(EnumerablePopulationBuilder builder, IObjectMappingData enumerableMappingData)
at AgileObjects.AgileMapper.ObjectPopulation.Enumerables.EnumerableMappingExpressionFactory.AddObjectPopulation(MappingCreationContext context)
at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.b__11_0(MappingExpressionFactoryBase factory, MappingCreationContext ctx)
at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.AddPopulationsAndCallbacks[TArg](TArg argument, MappingCreationContext context, Action2 mappingBodyPopulator) at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.AddPopulationsAndCallbacks(MappingCreationContext context) at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.Create(IObjectMappingData mappingData) at AgileObjects.AgileMapper.DataSources.Factories.Mapping.MappingDataSourceFactoryBase.CreateFor(IObjectMappingData mappingData) at AgileObjects.AgileMapper.DataSources.Factories.Mapping.MappingDataSourceSetFactory.CreateFor(IObjectMappingData mappingData) at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperFactory.Create[TSource,TTarget](ObjectMappingData2 mappingData)
at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData2.GetOrCreateMapper() at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetInlineMappingBlock(IObjectMappingData mappingData, MappingValues mappingValues, CreateMappingDataCallFactory createMappingDataCallFactory) at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetChildMapping(IObjectMappingData childMappingData, MappingValues mappingValues, ObjectMapperData declaredTypeMapperData) at AgileObjects.AgileMapper.ObjectPopulation.MappingFactory.GetChildMapping(IQualifiedMember sourceMember, Expression sourceMemberAccess, Int32 dataSourceIndex, IChildMemberMappingData childMappingData) at AgileObjects.AgileMapper.DataSources.EnumerableDataSource.GetMapping(IDataSource sourceEnumerableDataSource, Int32 dataSourceIndex, IChildMemberMappingData enumerableMappingData) at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.GetFinalDataSource(IDataSource foundDataSource, IChildMemberMappingData mappingData) at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.GetSourceMemberDataSource() at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.get_MatchingSourceMemberDataSource() at AgileObjects.AgileMapper.DataSources.Factories.DataSourceFindContext.UseSourceMemberDataSource() at AgileObjects.AgileMapper.DataSources.Factories.SourceMemberDataSourcesFactory.<Create>d__0.MoveNext() at AgileObjects.AgileMapper.DataSources.Factories.MemberDataSourceSetFactory.<EnumerateDataSources>d__2.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source)
at AgileObjects.AgileMapper.DataSources.Factories.MemberDataSourceSetFactory.CreateFor(DataSourceFindContext findContext)
at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeConstructionFactory.ConstructionDataInfo1..ctor(TInvokable invokable, ConstructionKey key, Int32 priority) at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeConstructionFactory.ObjectNewingInfo..ctor(ConstructorInfo ctor, ConstructionKey key) at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeConstructionFactory.<>c__DisplayClass9_0.<GetGreediestAvailableNewingInfos>b__0(ConstructorInfo ctor) at AgileObjects.AgileMapper.Extensions.PublicEnumerableExtensions.<>c__02.b__0_0(Func2 p, TItem item) at AgileObjects.AgileMapper.Extensions.PublicEnumerableExtensions.<Project>d__13.MoveNext()
at AgileObjects.AgileMapper.Extensions.PublicEnumerableExtensions.d__42.MoveNext() at AgileObjects.AgileMapper.Extensions.Internal.EnumerableExtensions.<TakeUntil>d__61.MoveNext()
at System.Linq.Buffer1..ctor(IEnumerable1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source) at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeConstructionFactory.CreateConstructionInfo[T](IEnumerable1 invokables, Func2 dataFactory) at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeConstructionFactory.GetGreediestAvailableNewingInfos(IEnumerable1 constructors, ConstructionKey key, IBasicConstructionInfo greediestUnconditionalFactoryInfo)
at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeConstructionFactory.AddAutoConstructionInfos(IList1 constructionInfos, ConstructionKey key) at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeConstructionFactory.<>c.<GetTargetObjectCreationInfos>b__4_0(ConstructionKey key) at AgileObjects.AgileMapper.Caching.ArrayCache2.GetOrAdd(TKey key, Func2 valueFactory) at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeConstructionFactory.GetTargetObjectCreationInfos(IObjectMappingData mappingData, ConstructionKey& constructionKey) at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeConstructionFactory.GetTargetObjectCreationInfos(IObjectMappingData mappingData) at AgileObjects.AgileMapper.MappingDataExtensions.GetTargetObjectCreationInfos(IObjectMappingData mappingData) at AgileObjects.AgileMapper.ObjectPopulation.ComplexTypes.ComplexTypeMappingExpressionFactory.TargetCannotBeMapped(IObjectMappingData mappingData, String& reason) at AgileObjects.AgileMapper.ObjectPopulation.MappingExpressionFactoryBase.Create(IObjectMappingData mappingData) at AgileObjects.AgileMapper.DataSources.ComplexTypeDataSource.Create(IObjectMappingData mappingData) at AgileObjects.AgileMapper.DataSources.Factories.Mapping.ComplexTypeMappingDataSourceFactory.CreateFor(IObjectMappingData mappingData) at AgileObjects.AgileMapper.DataSources.Factories.Mapping.MappingDataSourceSetFactory.CreateFor(IObjectMappingData mappingData) at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperFactory.Create[TSource,TTarget](ObjectMappingData2 mappingData)
at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData2.GetOrCreateMapper() at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperFactory.<>c__62.b__6_0(IRootMapperKey key)
at AgileObjects.AgileMapper.Caching.ArrayCache2.GetOrAdd(TKey key, Func2 valueFactory)
at AgileObjects.AgileMapper.ObjectPopulation.ObjectMapperFactory.GetOrCreateRoot[TSource,TTarget](ObjectMappingData2 mappingData) at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData2..ctor(TSource source, TTarget target, Nullable1 elementIndex, Object elementKey, MappingTypes mappingTypes, IMappingContext mappingContext, IObjectMappingData declaredTypeMappingData, IObjectMappingData parent, Boolean createMapper) at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingDataFactory.ForRootFixedTypes[TSource,TTarget](TSource source, TTarget target, MappingTypes mappingTypes, IMappingContext mappingContext, Boolean createMapper) at AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingDataFactory.ForRootFixedTypes[TSource,TTarget](TSource source, TTarget target, IMappingContext mappingContext, Boolean createMapper) at AgileObjects.AgileMapper.MappingExecutor1.PerformMapping[TTarget](TTarget target)
at AgileObjects.AgileMapper.MappingExecutor1.PerformMapping[TTarget](MappingRuleSet ruleSet, TTarget target) at AgileObjects.AgileMapper.MappingExecutor1.ToANewTResult
at AgileObjects.AgileMapper.Mapper.AgileObjects.AgileMapper.IMapper.DeepClone[TSource](TSource source)
at AgileObjects.AgileMapper.Mapper.DeepClone[TSource](TSource source)
at mt.Client.Common.ViewModels.Activity.AttendanceGridSettingsViewModel.OnInitialize(Object[] args) in C:\Data\mt_src\csharp\mt\mt.Client.Common\ViewModels\Activity\AttendanceGridSettingsViewModel.cs:line 98
at mt.Shared.Base.MtViewModelBase.Initialize(IMtViewModelParent parent, Object[] args) in C:\Data\mt_src\csharp\mt\mt.Shared\Base\MtViewModelBase.cs:line 93
at mt.Shared.Base.MtViewModelBase.Initialize(IMtViewModelParent parent) in C:\Data\mt_src\csharp\mt\mt.Shared\Base\MtViewModelBase.cs:line 76
at mt.Client.Common.UserControls.Activity.AttendanceGridSettingsUserControl.InitializeStart(Object[] args) in C:\Data\mt_src\csharp\mt\mt.Client.Common\UserControls\Activity\AttendanceGridSettingsUserControl.cs:line 49
at mt.Shared.Base.MtUserControlBase.Initialize(Object[] args) in C:\Data\mt_src\csharp\mt\mt.Shared\Base\MtUserControlBase.cs:line 148
2021-03-09 08:02:36,278 [1] INFO - Notification: Object reference not set to an instance of an object.

ViewDataDto.cs.txt

ViewDataGridPreferencesDto.cs.txt

@vsederburg
Copy link
Author

vsederburg commented Mar 9, 2021

Oh, and I'm calling the clone simply with:

private readonly ViewDataGridPreferencesDto _viewData; // set in constructor
private ViewDataGridPreferencesDto _originalViewData;

protected some method
{
    _originalViewData = Mapper.DeepClone(_viewData);
}

@SteveWilkes
Copy link
Member

Hello!

Thanks for letting me know about this - could I have the source for Preference, UserPreferenceDto and any other concrete types in the object tree?

Cheers,

Steve

@vsederburg
Copy link
Author

I replied to the email and attached the files. Do they get to you that way? If I have to put them here I can do that.

@SteveWilkes
Copy link
Member

Unfortunately not! You could attach them here or make a Git repo with them in?

@vsederburg
Copy link
Author

Files attached!

files.zip

@SteveWilkes
Copy link
Member

SteveWilkes commented Mar 18, 2021

Thanks very much - I'll check this out as soon as I can 👍🏻

@replaysMike
Copy link

replaysMike commented Mar 26, 2021

I'm not sure if it's related, but we are seeing null ref's internally occurring in Map<TDest>(TSource) when mapping ICollections and not sure if it's related to the above or not yet as I can't yet repro it in a unit test, but it happens in our pipeline.

EDIT: some context in my case

System.NullReferenceException: Object reference not set to an instance of an object.
   at object AgileObjects.AgileMapper.ObjectPopulation.ObjectMappingData<TSource, TTarget>.AgileObjects.AgileMapper.ObjectPopulation.IObjectMappingData.MapStart()
   at TTarget AgileObjects.AgileMapper.MappingExecutor<TSource>.PerformMapping<TTarget>(TTarget target)
   at TResult AgileObjects.AgileMapper.MappingExecutor<TSource>.ToANew<TResult>()
   at TDestination Common.Mapping.WrappedMapper<TSource, TDestination>.Map(TSource source, MappingOptions options)

@replaysMike
Copy link

my comment above was moved to it's own issue as it's different: #212

@SteveWilkes SteveWilkes self-assigned this Apr 6, 2021
@SteveWilkes SteveWilkes added the bug label Apr 6, 2021
@SteveWilkes
Copy link
Member

SteveWilkes commented Apr 6, 2021

Hi @vsederburg,

Just looking at this now - could you let me know where the ObservableObject type (from which your DtoBase type derives) is from? I can't find one in the framework in any of the namespaces listed in DtoBase's source...

Also - and this isn't the cause of this issue and you may have already found it, but just in case - to deep-clone a ViewDataGridPreferencesDto you'll have to tell the mapper what to use for the callerSource constructor parameter, as the corresponding property is named Source:

_originalViewData = Mapper.DeepClone(_viewData, cfg => cfg
    .Map((svd, tvd) => svd.Source)
    .ToCtor<GridPreferenceCallerSource>());

Cheers,

Steve

@vsederburg
Copy link
Author

I've attached the ObservableObject class. Sorry I missed that one.

For the ViewDataGridPreferencesDto you mentioned... would it fix that if I just changed the corresponding property name to CallerSource, or make them match one way or the other?

ObservableObject.cs.txt

@SteveWilkes
Copy link
Member

SteveWilkes commented Apr 6, 2021

Hi,

Thanks for ObservableObject's source - the mapper believe it or not was falling over trying to figure out how to map to its PropertyInfo[], so I've updated target member selection to exclude most BCL non-value-type targets. The mapper isn't really intended to be used to map PropertyInfos or Streams or HttpContexts or anything like that, so I believe it will still cover the vast majority of scenarios.

If ViewDataGridPreferencesDto.Source was named CallerSource - or the constructor parameter was named source - the mapper won't need the configuration, no.

Thanks again for reporting the issue!

All the best,

Steve

@SteveWilkes SteveWilkes added the in-branch A feature or bug fix exists in code, and a release will follow label Apr 6, 2021
@vsederburg
Copy link
Author

That's weird, that has been the base class forever and it's never complained before. Oh well, looking forward to the update. This mapper is super useful. :-)

@SteveWilkes
Copy link
Member

Hi,

I've now uploaded a preview v1.8 release to NuGet with this issue fixed - please could you try it out and let me know how you get on?

Thanks,

Steve

@SteveWilkes SteveWilkes added in-preview A feature or bug fix exists in a preview release, and a full release will follow and removed in-branch A feature or bug fix exists in code, and a release will follow labels Apr 6, 2021
@vsederburg
Copy link
Author

YES! All seems to be working again. Thanks so much!

@SteveWilkes
Copy link
Member

Excellent! You're welcome, thanks for checking :)

SteveWilkes added a commit that referenced this issue Apr 28, 2021
* Updating AO packages

* Adding .NET Standard 2.0 target / Rationalising compiler directives / Removing non-latest-major-version .NET Core test projects

* Fixing caching thread safety issue / Handling null keys in default key comparer, re: #212

* Throwing ObjectDisposedException on attempt to use a disposed mapper

* Simplifying numeric constants setup, re: #213

* Tidying

* Improving target member selection, re: #209

* Adding v1.8 preview NuGet package

* Tidying documentation

* Organising classes

* Features/target member matcher data sources (#214)

* Adding data source -> target member matcher selection

* Member matcher data sources / Conflict testing / Documentation improvements

* Fixing query projection

* All fixed

* Adding documentation

* Updating release notes / Updating to v1.8

* Extra test coverage

* Adding v1.8 NuGet package
@SteveWilkes
Copy link
Member

This fix is in the full v1.8 release, which is now available on NuGet.

Thanks!

@SteveWilkes SteveWilkes removed the in-preview A feature or bug fix exists in a preview release, and a full release will follow label Apr 28, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants