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];