Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При создании экземпляров типов сущностей POCO Entity Framework часто создает экземпляры динамически созданного производного типа, который выступает в качестве прокси-сервера для сущности. Этот прокси изменяет некоторые виртуальные свойства сущности, вставляя перехватчики, чтобы действия выполнялись автоматически при обращении к свойству. Например, этот механизм используется для поддержки отложенной загрузки связей. Методы, показанные в этом разделе, применяются одинаково к моделям, созданным с помощью code First и ef Designer.
Отключение создания прокси-сервера
Иногда полезно предотвратить создание прокси-экземпляров в Entity Framework. Например, сериализация экземпляров, не являющихся прокси-серверами, значительно упрощается по сравнению с сериализацией экземпляров прокси. Создание прокси-сервера можно отключить, очищая ProxyCreationEnabled флаг. Вы можете сделать это в конструкторе своего контекста. Рассмотрим пример.
public class BloggingContext : DbContext
{
public BloggingContext()
{
this.Configuration.ProxyCreationEnabled = false;
}
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
Обратите внимание, что EF не будет создавать прокси для типов, где для прокси ничего не требуется. Это означает, что вы также можете избежать прокси-серверов, имея типы, которые запечатаны и (или) не имеют виртуальных свойств.
Явное создание экземпляра прокси-сервера
Экземпляр прокси-сервера не будет создан, если вы создаете экземпляр сущности с помощью нового оператора. Это может не быть проблемой, но если вам нужно создать экземпляр прокси-сервера (например, чтобы отложенная загрузка или отслеживание изменений прокси-сервера работали), то это можно сделать с помощью Create метода DbSet. Рассмотрим пример.
using (var context = new BloggingContext())
{
var blog = context.Blogs.Create();
}
Универсальная версия Create может использоваться, если требуется создать экземпляр производного типа сущности. Рассмотрим пример.
using (var context = new BloggingContext())
{
var admin = context.Users.Create<Administrator>();
}
Обратите внимание, что Create метод не добавляет или присоединяет созданную сущность к контексту.
Обратите внимание, что метод Create просто создаст экземпляр типа сущности, если создание прокси-типа для этой сущности не имеет смысла, так как прокси не выполняет никакой функции. Например, если тип сущности запечатан и (или) не имеет виртуальных свойств, Create то просто создаст экземпляр типа сущности.
Получение фактического типа сущности из прокси-типа
Типы прокси-сервера имеют имена, которые выглядят примерно так:
System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6
Тип сущности для этого типа прокси можно найти с помощью метода GetObjectType из ObjectContext. Рассмотрим пример.
using (var context = new BloggingContext())
{
var blog = context.Blogs.Find(1);
var entityType = ObjectContext.GetObjectType(blog.GetType());
}
Обратите внимание, что если переданный GetObjectType тип является экземпляром типа сущности, который не является типом прокси,то тип сущности по-прежнему возвращается. Это означает, что этот метод всегда можно использовать для получения фактического типа сущности без необходимости проверять, является ли тип прокси-типом.