Как определить, является ли сущность POCO прокси-сущностью (платформа Entity Framework)
Данный раздел демонстрирует, как определить, является ли сущность POCO прокси-сущностью. В некоторых случаях необходимо проверить, не является ли объект POCO на самом деле прокси-сущностью. При создании сущности POCO посредством метода CreateObject, если тип POCO не соответствует требованиям, описанным в Требования к созданию прокси-сущностей POCO (платформа Entity Framework), то вместо прокси-объекта создается сущность POCO. Дополнительные сведения см. в разделе Работа с сущностями POCO (платформа Entity Framework).
В примере из этого раздела используются классы POCO, определенные в разделе Как определить сущности POCO (платформа Entity Framework), и модель данных на основе AdventureWorks, определенная в разделе Как настроить файлы моделирования и сопоставления для работы с пользовательскими объектами (платформа Entity Framework).
Пример
В следующем примере для создания прокси-объекта используется метод CreateObject. Затем пример проверяет, является ли объект прокси-объектом, сравнивая тип POCO с созданным прокси-типом. Если типы не совпадают, то объект является прокси-объектом. Если объект является прокси-объектом, то он как минимум представляет собой прокси-объект «неспешной» загрузки. Чтобы определить, является ли он также прокси-объектом, отслеживающим изменения, можно проверить, отслеживаются ли изменения.
Public Shared Function IsProxy(ByVal type As Object) As Boolean
Return type IsNot Nothing AndAlso ObjectContext.GetObjectType(type.GetType()) <> type.GetType()
End Function
Public Shared Sub TestIfEntityIsProxy()
Using context As New POCOAdventureWorksEntities()
Dim newItem As LineItem = context.CreateObject(Of LineItem)()
newItem.SalesOrderDetailID = 0
' Assign the order to the new LineItem.
newItem.SalesOrderID = 43680
newItem.OrderQty = 1
newItem.ProductID = 750
newItem.UnitPriceDiscount = 0
newItem.UnitPrice = 2171.2942D
newItem.ModifiedDate = DateTime.Today
newItem.rowguid = Guid.NewGuid()
newItem.SpecialOfferID = 1
context.LineItems.Attach(newItem)
' Determine if the instance is a proxy.
' If it is a proxy it supports lazy loading.
Dim isLazyLoading As Boolean = IsProxy(newItem)
' Determine if it is a change tracking proxy by
' making a change and verifying that it was detected.
newItem.OrderQty = 2
Dim isChangeTracking As Boolean = _
context.ObjectStateManager.GetObjectStateEntry(newItem).State = EntityState.Modified
End Using
End Sub
public static bool IsProxy(object type)
{
return type != null && ObjectContext.GetObjectType(type.GetType()) != type.GetType();
}
public static void TestIfEntityIsProxy()
{
using (POCOAdventureWorksEntities context = new POCOAdventureWorksEntities())
{
LineItem newItem = context.CreateObject<LineItem>();
newItem.SalesOrderDetailID = 0;
// Assign the order to the new LineItem.
newItem.SalesOrderID = 43680;
newItem.OrderQty = 1;
newItem.ProductID = 750;
newItem.UnitPriceDiscount = 0;
newItem.UnitPrice = 2171.2942M;
newItem.ModifiedDate = DateTime.Today;
newItem.rowguid = Guid.NewGuid();
newItem.SpecialOfferID = 1;
context.LineItems.Attach(newItem);
// Determine if the instance is a proxy.
// If it is a proxy it supports lazy loading.
bool isLazyLoading = IsProxy(newItem);
// Determine if it is a change tracking proxy by
// making a change and verifying that it was detected.
newItem.OrderQty = 2;
bool isChangeTracking = context.ObjectStateManager
.GetObjectStateEntry(newItem)
.State == EntityState.Modified;
}
}
См. также
Задачи
Как создать сущность POCO с прокси (платформа Entity Framework)
Основные понятия
Отслеживание изменений в сущностях POCO (платформа Entity Framework)