Sdílet prostřednictvím


Práce s proxy servery

Při vytváření instancí typů entit POCO Entity Framework často vytváří instance dynamicky generovaného odvozeného typu, který funguje jako proxy pro entitu. Tento proxy server přepíše některé virtuální vlastnosti entity tak, aby se při přístupu k vlastnosti automaticky vkládaly hooky pro provádění akcí. Tento mechanismus se například používá k podpoře opožděného načítání relací. Techniky uvedené v tomto tématu jsou rovnocenné pro modely vytvořené pomocí Code First a EF Designeru.

Zakázání vytváření proxy serveru

Někdy je užitečné zabránit entity Framework ve vytváření instancí proxy serveru. Například serializace jiných než proxy instancí je výrazně jednodušší než serializace instancí proxy. Vytvoření proxy serveru je možné vypnout zrušením zaškrtnutí příznaku ProxyCreationEnabled . Jedno místo, které byste mohli udělat, je v konstruktoru vašeho kontextu. Příklad:

public class BloggingContext : DbContext
{
    public BloggingContext()
    {
        this.Configuration.ProxyCreationEnabled = false;
    }  

    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

Mějte na paměti, že EF nevytvoří proxy servery pro typy, kde není nic, co by proxy udělal. To znamená, že se také můžete vyhnout proxy serverům tím, že máte typy, které jsou zapečetěné nebo nemají žádné virtuální vlastnosti.

Explicitní vytvoření instance proxy serveru

Pokud vytvoříte instanci entity pomocí nového operátoru, instance proxy serveru se nevytvoří. Nemusí to být problém, ale pokud potřebujete vytvořit instanci proxy serveru (například proto, aby opožděné načítání nebo sledování změn proxy serveru fungovalo), můžete to provést pomocí Create metody DbSet. Příklad:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Create();
}

Obecnou verzi Create lze použít, pokud chcete vytvořit instanci odvozeného typu entity. Příklad:

using (var context = new BloggingContext())
{
    var admin = context.Users.Create<Administrator>();
}

Všimněte si, že Create metoda nepřidá nebo nepřipojuje vytvořenou entitu k kontextu.

Všimněte si, že Create metoda pouze vytvoří instanci samotného typu entity, pokud by vytvoření typu proxy pro entitu nemělo žádnou hodnotu, protože by nic neudělá. Pokud je například typ entity zapečetěný nebo nemá žádné virtuální vlastnosti, Create stačí vytvořit instanci typu entity.

Získání skutečného typu entity z typu proxy

Typy proxy serverů mají názvy, které vypadají nějak takto:

System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

Typ entity pro tento typ proxy serveru můžete najít pomocí GetObjectType metody z ObjectContext. Příklad:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Find(1);
    var entityType = ObjectContext.GetObjectType(blog.GetType());
}

Všimněte si, že pokud je typ předaný GetObjectType instancí typu entity, který není typem proxy, vrátí se typ entity. To znamená, že tuto metodu můžete vždy použít k získání skutečného typu entity bez jakékoli jiné kontroly, abyste zjistili, jestli se jedná o typ proxy serveru nebo ne.