public ForeignKey(
            [NotNull] IReadOnlyList <Property> dependentProperties,
            [NotNull] Key principalKey,
            [CanBeNull] EntityType principalEntityType = null)
        {
            Check.NotEmpty(dependentProperties, nameof(dependentProperties));
            Check.HasNoNulls(dependentProperties, nameof(dependentProperties));
            MetadataHelper.CheckSameEntityType(dependentProperties, nameof(dependentProperties));
            Check.NotNull(principalKey, nameof(principalKey));

            Properties = dependentProperties;

            var principalProperties = principalKey.Properties;

            Property.EnsureCompatible(principalProperties, dependentProperties);

            if (principalEntityType?.GetKeys().Contains(principalKey) == false)
            {
                throw new ArgumentException(
                          Strings.ForeignKeyReferencedEntityKeyMismatch(
                              principalKey,
                              principalEntityType));
            }

            _principalKey = principalKey;

            PrincipalEntityType = principalEntityType ?? _principalKey.EntityType;
        }
        public ForeignKey(
            [NotNull] IReadOnlyList <Property> dependentProperties,
            [NotNull] Key principalKey,
            [NotNull] EntityType dependentEntityType,
            [NotNull] EntityType principalEntityType)
        {
            Check.NotEmpty(dependentProperties, nameof(dependentProperties));
            Check.HasNoNulls(dependentProperties, nameof(dependentProperties));
            MetadataHelper.CheckSameEntityType(dependentProperties, nameof(dependentProperties));
            Check.NotNull(principalKey, nameof(principalKey));
            Check.NotNull(principalEntityType, nameof(principalEntityType));

            Properties = dependentProperties;

            PrincipalKey = principalKey;

            DeclaringEntityType = dependentEntityType;
            PrincipalEntityType = principalEntityType;

            AreCompatible(principalKey.Properties, dependentProperties, principalEntityType, dependentEntityType, shouldThrow: true);

            if (!principalEntityType.GetKeys().Contains(principalKey))
            {
                throw new ArgumentException(
                          CoreStrings.ForeignKeyReferencedEntityKeyMismatch(
                              Property.Format(principalKey.Properties),
                              principalEntityType));
            }
        }