From here give you solution with implicit form(with Solve),but is very mesy:
On[$Assumptions]; (*shows when $Assumptions is changed*)
Module[{assum = True},
Internal`InheritedBlock[{Solve, $Assumptions}, Unprotect[Solve];
call : Solve[eq_, v_, opts___] /; ! TrueQ[$in] :=
Block[{$in = True, $res1, $res2},
Check[(*Use Check to try default settings& respond to \
messages*)$res1 = call (*try original call*),(*Check[]*)
Print["Trying \"ReduceOptions\" -> \"UseTranscendentalSolve\" -> \
True on ", HoldForm[call]];
With[{redopts = SystemOptions["ReduceOptions"]},
Internal`WithLocalSettings[
SetSystemOptions[
"ReduceOptions" -> "UseTranscendentalSolve" -> True],(*I`WLS:
init*)$res2 = Solve[eq, v, GeneratedParameters -> $S, opts];
$res2 = $res2 /.
ConditionalExpression[e_,
c_] :>(*map condition to assumption*)($Assumptions = \
$Assumptions && c;(*for solvers and Simplify[]*)
assum = assum && c;(*for addConditions[] at end*)e);
Print[
"$Assumptions now ", $Assumptions];(*context for \
On[$Assumptions]*)$res2 = Simplify[$res2];
Print["Result= ", $res2],
SetSystemOptions[
redopts] (*I`WLS:
reset*)];];
If[FreeQ[$res2,
Solve], $res2, $res1],(*Check[]*){Solve::ifun}]];
Protect[Solve];
sol = DSolve[DSolve[y'[x] == (x^2 + y[x]^2)/(x*y[x] - x^2), y, x]];
Print["$Assumptions finally ", $Assumptions];(*context for \
On[$Assumptions]*)sol = sol /. addConditions[assum]]]
Off[$Assumptions];