Vraag Entity Framework CTP5 - Meerdere recordsets lezen van een opgeslagen procedure


In EF4 was dit niet gemakkelijk mogelijk. Je moest ofwel degraderen tot klassiek ADO.NET (DataReader), gebruik ObjectContext.Translate of gebruik de EFExtensions project.

Is dit in EF CTP5 van de plank gehaald?

Zo nee, wat is de aanbevolen manier om dit te doen?

Moeten we de DbContext<T> als een IObjectContextAdapter en toegang tot het onderliggende ObjectContext om deze methode te bereiken?

Kan iemand me op een goed artikel wijzen om dit te doen met EF CTP5?


11
2018-03-09 22:57


oorsprong


antwoorden:


Dus ik heb dit aan het werk gekregen, hier is wat ik heb:

internal SomeInternalPOCOWrapper FindXXX(string xxx)
{
    Condition.Requires(xxx).IsNotNullOrEmpty();

    var someInternalPokey = new SomeInternalPOCOWrapper();
    var ctx = (this as IObjectContextAdapter).ObjectContext;

    var con = new SqlConnection("xxxxx");
    {
        con.Open();
        DbCommand cmd = con.CreateCommand();
        cmd.CommandText = "exec dbo.usp_XXX @xxxx";
        cmd.Parameters.Add(new SqlParameter("xxxx", xxx));

        using (var rdr = cmd.ExecuteReader())
        {
            // -- RESULT SET #1
            someInternalPokey.Prop1 = ctx.Translate<InternalPoco1>(rdr);

            // -- RESULT SET #2
            rdr.NextResult();
            someInternalPokey.Prop2 = ctx.Translate<InternalPoco2>(rdr);

            // -- RESULT SET #3
            rdr.NextResult();
            someInternalPokey.Prop3 = ctx.Translate<InternalPoco3>(rdr);

            // RESULT SET #4
            rdr.NextResult();
            someInternalPokey.Prop4 = ctx.Translate<InternalPoco4>(rdr);
        }
        con.Close();
    }

    return someInternalPokey;
}

In wezen is het in principe hetzelfde als klassiek ADO.NET. Je leest het DbReader, ga door naar de volgende resultaatset, etc.

Maar we hebben tenminste de Translate methode die schijnbaar van links naar rechts tussen de resultaatsetvelden en de geleverde entiteit werkt.

Merk op dat de methode intern is.

My Repository roept deze methode dan aan hydrateert de DTO in mijn domeinobjecten.

Ik ben om drie redenen niet 100% tevreden over:

  1. We moeten de DbContext als IObjectContextAdapter. De methode Translate zou moeten zijn DbContext<T> klasse IMO.
  2. We moeten klassieke ADO.NET-objecten gebruiken. Waarom? Opgeslagen procedures zijn een moet hebben voor elke ORM. Mijn belangrijkste klacht bij EF is het ontbreken van de ondersteuning voor opgeslagen procedures en dit lijkt niet te zijn verholpen met EF CTP5.
  3. U moet een nieuwe SqlConnection openen. Waarom kan het niet dezelfde verbinding gebruiken als de verbinding die is geopend door de EF-context?

Ik hoop dat dit zowel iemand helpt als een bericht stuurt naar het EF-team. We hebben meerdere resultaatondersteuning nodig voor SPROCS vanaf de plank. U kunt een opgeslagen proc toewijzen aan een complex type, dus waarom kunnen we een opgeslagen proc niet toewijzen aan meerdere complexe typen?


11
2018-03-15 23:45