A következő címkéjű bejegyzések mutatása: Entity Framework. Összes bejegyzés megjelenítése
A következő címkéjű bejegyzések mutatása: Entity Framework. Összes bejegyzés megjelenítése

2017. június 23., péntek

Entity Framework cache frissítése

Entity Framework 6-ban a DbContext automatikusan cache-eli az adatokat, ami az esetek jelentős részében teljesen jó dolognak számít. Azonban vannak olyan szituációk, amikor az elérni kívánt adatok az aktuális contexten kívül már megváltoztak (például másik felhasználó módosította vagy tárolt eljárás ért hozzá). 

Több lehetőség is létezik a helyzet kezelésére:
1. A követés kikapcsolása az AsNoTracking() utasítással
2. Régi DbContext példány eldobása és új létrehozása
3. ObjectQuery használata a MergeOptions beállításával a DBQuery helyett
4. Elem frissítése (Reload / Refresh)
5. Elem leválasztása (Detach)
6. GetDatabaseValues hívás, hogy egy adott Elem (Entity) frissítve legyen
7. A régi adatok használata

Ezen a linken részletesen körbejárják az egyes lehetőségeket, hogy melyiket mikor is éri meg használni. 

2016. június 28., kedd

Entity Frameworkből UDT paraméterű tárolt eljárás futtatása

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

2. Ezt a típust paraméterként használó tárolt eljárás létrehozása

CREATE PROCEDURE [dbo].[DummyStoredProcedure]
       @myValues [Temp_IDTABLE] READONLY
AS
BEGIN
       -- értelmes logika
       SELECT * FROM @myValues
END

3. A használt EF verziónak megfelelő EntityFrameworkExtras hozzáadása a projekthez
  • EF 5: EntityFrameworkExtras.EF5
  • EF 6: EntityFrameworkExtras.EF6

4. Létre kell hozni egy osztályt, ami majd az 1. lépésben elkészült UDT-t fogja reprezentálni

[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);