/// <summary>
 ///     Determines whether the specified object is equal to the current object.
 /// </summary>
 /// <param name="other"> The object to compare with the current object. </param>
 /// <returns> <c>True</c> if the specified object is equal to the current object; otherwise, <c>false</c>. </returns>
 protected virtual bool Equals([NotNull] TypeMaterializationInfo other)
 => ProviderClrType == other.ProviderClrType &&
 ModelClrType == other.ModelClrType &&
 Equals(Mapping, other.Mapping) &&
 Equals(Property, other.Property) &&
 Index == other.Index &&
 IsFromLeftOuterJoin == other.IsFromLeftOuterJoin;
        protected virtual bool Equals([NotNull] TypeMaterializationInfo other)
        => ProviderClrType == other.ProviderClrType &&
        ModelClrType == other.ModelClrType &&
        Equals(Mapping, other.Mapping) &&
        Equals(Property, other.Property)
#pragma warning disable CS0612 // Type or member is obsolete
        && Index == other.Index &&
        IsFromLeftOuterJoin == other.IsFromLeftOuterJoin
#pragma warning restore CS0612 // Type or member is obsolete
        && IsNullable == other.IsNullable;
 /// <summary>
 ///     Determines whether the specified object is equal to the current object.
 /// </summary>
 /// <param name="other"> The object to compare with the current object. </param>
 /// <returns> <c>True</c> if the specified object is equal to the current object; otherwise, <c>false</c>. </returns>
 protected virtual bool Equals([NotNull] TypeMaterializationInfo other)
 => StoreType == other.StoreType &&
 ModelType == other.ModelType &&
 Equals(Mapping, other.Mapping) &&
 Equals(Property, other.Property) &&
 Index == other.Index;