protected virtual IEnumerable <MigrationOperation> Diff(
     [NotNull] IEnumerable <IForeignKey> source,
     [NotNull] IEnumerable <IForeignKey> target,
     [NotNull] DiffContext diffContext)
 => DiffCollection(
     source,
     target,
     (s, t) => Diff(s, t, diffContext),
     t => Add(t, diffContext),
     s => Remove(s, diffContext),
     (s, t) => (Annotations.For(s).Name == Annotations.For(t).Name) &&
     s.Properties.Select(diffContext.FindTarget).SequenceEqual(t.Properties) &&
     (diffContext.FindTarget(s.PrincipalEntityType.RootType()) == t.PrincipalEntityType.RootType()) &&
     s.PrincipalKey.Properties.Select(diffContext.FindTarget).SequenceEqual(t.PrincipalKey.Properties) &&
     (s.DeleteBehavior == t.DeleteBehavior));
 protected virtual IEnumerable <MigrationOperation> Diff(
     IEnumerable <IForeignKey> source,
     IEnumerable <IForeignKey> target,
     DiffContext diffContext)
 => DiffCollection(
     source,
     target,
     (s, t) => Diff(s, t, diffContext),
     t => Add(t, diffContext),
     s => Remove(s, diffContext),
     (s, t) =>
 {
     return(Annotations.For(s).Name == Annotations.For(t).Name &&
            s.Properties.Select(diffContext.FindTarget).SequenceEqual(t.Properties) &&
            diffContext.FindTarget(s.PrincipalEntityType.RootType()) == t.PrincipalEntityType.RootType() &&
            s.PrincipalKey.Properties.Select(diffContext.FindTarget).SequenceEqual(t.PrincipalKey.Properties));
 });