Sync or Async Methods in Abstract Class
<p>I think about using the following <code>abstract class</code> as a base for database migrations:</p>

<pre><code>using System.Threading.Tasks;

public abstract class MigrationBase
{
    public abstract string Name { get; }
    public abstract string Description { get; }
    public abstract int FromVersion { get; }
    public abstract int ToVersion { get; }
    public abstract void Apply();
    public abstract Task ApplyAsync();
}
</code></pre>

<p>Now, depending on the underlaying database system a concrete migration will be written for, it may make more sense to implement the <code>void Apply</code> or the <code>Task ApplyAsync</code> method. I see the following options:</p>

<ol>
<li>If I decide just having one of both abstract methods, I force the developer implementing the concrete migration to do it wrong either in the <a href="https://blogs.msdn.microsoft.com/pfxteam/2012/04/13/should-i-expose-synchronous-wrappers-for-asynchronous-methods/" rel="nofollow noreferrer">one</a> or <a href="https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/" rel="nofollow noreferrer">the other</a> way "in 50% of the cases".</li>
<li>If I decide having both abstract methods, I force him doing it wrong whenever the database system doesn't offer both possibilities.</li>
<li>Having a <code>MigrationBase</code>, <code>SyncMigrationBase</code> and <code>AsyncMigrationBase</code> and using typecasts everywhere doesn't seem reasonable to me.</li>
<li>Is there a better option I'm currently missing?</li>
</ol>

<p>Now you might say I could just choose option two because ADO.Net offers sync and async methods and <em>in most cases</em> the database adapters will offer both variants. Is there a better solution if you look at the more general problem without ADO.Net in mind?<br>
If I chose option two, should I provide a preimplemented version of the <code>Task ApplyAsync</code> similar to what Microsoft did with <code>System.IO.Stream.ReadAsync</code> while considering what Stephen Toub has written? If yes, what else should I pay attention to?</p>