Az Entity Framework alaphangon nem támogatja a saját SQL típust, vagyis a User Defined Type-ot. Ha egy olyan tárolt eljárást szeretnénk importálni az EF-fel, ami UDT típusú paramétert vár, akkor ugyan nem fog hibát dobni, de nem is fogja legenerálni a hozzátartozó kódot.
Ennek áthidalására egy jó módszer az EntityFrameworkExtras nevű NuGettel is elérhető csomag, aminek segítségével típusosan lehet ilyen tárolt eljárást futtatni. A bekötéséhez az alábbi néhány lépés szükséges.
1. UDT létrehozása MS SQL Server adatbázisban
CREATE TYPE [dbo].[TEMP_IDTABLE] AS TABLE(
[ID] [int] NULL
)
GO
CREATE PROCEDURE [dbo].[DummyStoredProcedure]
@myValues [Temp_IDTABLE] READONLY
AS
BEGIN
-- értelmes logika
SELECT * FROM @myValues
END
- EF 5: EntityFrameworkExtras.EF5
- EF 6: EntityFrameworkExtras.EF6
[UserDefinedTableType("TEMP_IDTABLE")]
public class TempIdTable
{
[UserDefinedTableTypeColumn(1, Name = "ID")]
public int? ID { get; set; }
}
Természetesen az osztály és a mezők neve bármi lehet, mivel az attribútumokkal lesz beállítva, hogy az adatbázisban mire kell majd leképezni.
5. Az előbbihez hasonlóan a tárolt eljáráshoz kell egy osztály
[StoredProcedure("DummyStoredProcedure")]
public class DummyStoredProcedure
{
[StoredProcedureParameter(SqlDbType.Udt, ParameterName = "myValues")]
public List<TempIdTable> MyValues { get; set; }
}
6. Ezek után már csak meg kell hívni az eljárást. Ehhez az EntityFrameworkExtras tartalmaz Extended Methodokat, amik a DbObjectre illetve az ObjectContextre akadnak rá, és olyan objektumokat várnak, amik el vannak látva a StoredProcedure attribútummal.
ObjectContext oc = new ObjectContext("ConnectionString");
var sp = new DummyStoredProcedure
{
MyValues = new List<TempIdTable>
{
new TempIdTable { ID = 1 },
new TempIdTable { ID = 2 }
}
};
IEnumerable<int> results =
oc.ExecuteStoredProcedure<int>(sp);
Nincsenek megjegyzések:
Megjegyzés küldése