Naming columns in self referencing virtual properties

If I understand your question correctly you just need an ordinary many-to-many mapping with Fluent API:

modelBuilder.Entity<Element>()
    .HasMany(e => e.Parent)
    .WithMany(e => e.Child)
    .Map(m => {
        m.ToTable("ElementMap"); // name of the link table
        m.MapLeftKey("ParentID");
        m.MapRightKey("ChildID");
    });

I would expect that the generated migration will respect this mapping and use the supplied table and column names.