Compartir a través de


Entity Framework FAQ: Relaciones (es-ES)

Volver a EF FAQ tabla de contenido

¿El Entity Framework admite carga perezosa y carga profunda, y cómo es el desempeño de estas funciones?

El EF soporta carga perezosa y carga profunda, y el equipo ha trabajado para optimizar el rendimiento. Cuando se crea una consulta que será, de forma predeterminada, utilice carga perezosa. Sin embargo, puede optar en sobre una base por consulta deseoso de carga de una o más relaciones. El rendimiento de estas características depende de su escenario de uso particular. Para obtener más información acerca de los patrones para la carga de entidades relacionadas y consideraciones de rendimiento, consulte cargar objetos relacionados .

¿De http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID = 573966 & SiteID = 1

¿Es posible obigar al EF a cargar implícitamente entidades relacionadas? ¿La perezosa carga está activada de forma predeterminada?

En EF 4, carga perezosa está disponible y está activado por defecto en las clases de EntityObjects generado. Carga diferida está desactivada en STEs.

En EF 3.5 SP1, también es una forma de aplicar carga perezosa, pero requiere algún trabajo por tu parte. Revisa esta serie de entradas de blog: http://blogs.msdn.com/jkowalski/archive/2008/05/12/transparent-lazy-loading-for-entity-framework-part-1.aspx .

¿Hay un tema que compara la clave externa con la asociación independiente?

El definición y gestión de las relaciones tema en MSDN habla sobre las diferencias entre estos tipos de asociaciones.

¿Cómo puedo cambiar asociaciones independientes a asociaciones de claves externas?

No es posible automático de cambiar asociaciones independientes para asociaciones claves extranjeras. Puede hacerlo a mano sin regenerar los modelos. Usted puede ir a cada entidad, agregar y asignar la propiedad extranjera de clave y, a continuación, agregar una restricción referencial para la relación. Si desea automatizar TI, necesita escribir un programa que modifica directamente el XML en el archivo EDMX.

Para obtener más información, consulte http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/6710c95b-d657-460e-be46-d14c65bf8012 .

¿Son cambios a relaciones entre mis objetos siempre sincronizados en el administrador de estado?

Cuando realice cambios en las propiedades de navegación en sus objetos, Entity Framework sincronizará su manager de Estado para ciertos tipos de objetos elegibles:

  • Objetos de entidad que son código generado por las herramientas de Entity Data Model.
  • Objetos personalizados que implementan la interfaz IEntityWithChangeTracker.
  • Entidades POCO con proxies. Para obtener más información, consulte requisitos para crear POCO Proxies (Entity Framework) .

Para obtener más información, consulte definir y administrar relaciones .

¿Puedo cargar objetos relacionados con una entidad separada?

Si la entidad fue creada como resultado de una consulta de NoTracking, se pueden cargar datos relacionados mediante carga diferida o el método Load. Si, sin embargo, usted explícitamente desasociar una entidad desde el contexto, llamar a carga provocará una excepción y carga perezosa no se cargarán a entidades relacionadas.

¿Cuáles son los diferentes formas de crear y modificar las relaciones?

En el Entity Framework, puede crear y modificar las relaciones de varias maneras:

  1. Mediante la asignación de un nuevo objeto a una propiedad de navegación. El código siguiente crea una relación entre un pedido y el cliente. Si los objetos se conectan al ObjectContext, se agrega el pedido al cliente.Se establece la colección de órdenes y la propiedad clave extranjera correspondiente en el objeto de la orden.

    order.Customer = newCustomer
    
  2. Mediante la eliminación o adición de un objeto en una colección de la entidad. Por ejemplo, puede utilizar el método Add para agregar un objeto del tipo pedido para el cliente.Colección de órdenes o el método Remove para quitar un objeto de la colección (Remove elimina la relación, no el objeto). Esta operación crea y elimina una relación entre un orden determinado y el cliente. Si los objetos están conectados al contexto del objeto, se establecerá la referencia de cliente y la propiedad clave extranjera sobre el objeto del pedido al cliente apropiado:

    customer.Orders.Add(order)
    
  3. En asociaciones claves extranjeras, puede asignar un nuevo valor a una propiedad clave externa, como en el ejemplo siguiente. Si la referencia es en el estado mayor, la propiedad de navegación de referencia no se sincronizarán con los valores clave de un nuevo objeto hasta que se llama SaveChanges. Sincronización se produce porque el contexto del objeto no contiene claves permanentes para objetos agregados hasta que se guardan. Para obtener más información, consulte Trabajo con claves de entidad (Entity Framework). Si debe tener totalmente sincronizados en cuanto se establece la relación de objetos nuevos, utilice uno de los dos métodos anteriores para crear la relación.

    order.CustomerID = newCustomer.CustomerID
    orden  order.CustomerID = null
    
  4. Al crear la clave de entidad para un objeto específico. Si el objeto con esta clave ya existe en el contexto del objeto, el método CreateEntityKey devolverá el EntityKey del objeto existente. Este método se proporciona por compatibilidad con versiones anteriores con EF 3.5 SP1.

    orden de order.CustomerReference.EntityKey = ctx.CreateEntityKey("EntitySetName", newObject) 
    

¿Cuál es la diferencia entre el método Load y el método de LoadProperty?

Método de LoadProperty de ObjectContext es nuevo en el Entity Framework 4. El método carga objetos relacionados, lo mismo que EntityCollection.Load o EntityReference.Load. Puede utilizar el método LoadProperty con cualquier tipo de entidad. Sin embargo, POCO sólo funciona con LoadProperty. Para obtener más información, consulte cargar objetos relacionados .

Cuando quiero llamar a LoadProperty con una sobrecarga que toma una expresión lambda en Visual Basic, aparece el error "la expresión selector de LoadProperty debe ser un MemberAccess para la propiedad". ¿Esto es un problema conocido?

Se trata de un problema con la forma en que la EF analiza la expresión en Visual Basic. El equipo ha dicho que buscará una solución. Por ahora, la solución consiste en utilizar la sobrecarga del método LoadProperty que toma un parámetro de cadena.

¿Cómo me notifican cuando se agrega un elemento a la colección?

El evento AssociationChanged se produce cuando la asociación es cambiada o modificada. Porque la Asociación cambia siempre que se agrega un objeto a la colección, puede registrarse para el evento AssociationChanged. Para obtener más información, consulte Cómo: ejecutar la lógica de negocios durante el cambios asociación .

¿Entity Framework admite las asociaciones con carga?

Una asociación con capacidad de carga se refiere a una relación de varios a varios, donde la mesa de enlace contiene columnas adicionales distintas de claves externas. Entity Framework no admite las asociaciones con carga. En los siguientes blogs Alex explica el problema y la solución posible:

http://blogs.msdn.com/b/alexj/Archive/2008/02/24/Associations-with-payloads.aspx
http://blogs.msdn.com/b/alexj/Archive/2008/02/25/Associations-with-Payloads-Part-Deux.aspx
http://blogs.msdn.com/b/alexj/Archive/2008/02/26/Associations-with-Payloads-Closing-the-loop.aspx

¿Por qué las propiedades de navegación no generan el evento PropertyChanged?

Si observas el código generado para la entidad, se verá que las propiedades simples tienen una llamada a ReportPropertyChanged("PropertyName"), y esto es donde se llama al método OnPropertyChanged para provocar el evento. Propiedades de navegación no llaman a ese método. El siguiente error de conectar documentos el tema: https://connect.microsoft.com/VisualStudio/feedback/details/532257/entity-framework-navigation-properties-don-t-raise-the-propertychanged-event .

Hay dos maneras de evitar esto: (1) ajustar la propiedad de navegación con su propia propiedad en la clase parcial donde puede desencadenar el evento o realizar otras acciones en OnPropertyChanged y utilizar dicha propiedad ajustada para escenarios donde necesita la lógica adicional, o (2) modificar la plantilla de T4 que produce el código generado y agregar lo que desee. Para ello abrir el archivo EDMX en el diseñador, haga un espacio en blanco en la superficie de diseño y elija 'Agregar elemento de generación de código'. Esto agregará una copia de la plantilla de T4 al proyecto, y se puede modificar por lo que incluirá lo que desea en la propiedad. Por ejemplo, encontrar el siguiente código en el archivo .tt generado:

<#=code.SpaceAfter(Accessibility.ForSetter(navProperty))#>
set
{
((IEntityWithRelationships) this).RelationshipManager 
.GetRelatedReference<<#=MultiSchemaEscape(
navProperty.ToEndMember.GetEntityType(),
code)#>>
("<#=navProperty.RelationshipType.FullName#>",
"<#=navProperty.ToEndMember.Name#>")
.Value = value;
}

Puede agregar el código allí también. Más información acerca de las plantillas puede encontrarse aquí: http://msdn.microsoft.com/en-us/library/dd456821.aspx

¿Existe una manera de obtener acceso a las propiedades de navegación que apuntan a objetos eliminados dentro del evento SavingChanges o el método virtual SaveChanges?

Cuando se marca un objeto para su eliminación, sucede lo siguiente: si el objeto eliminado es una referencia, se establecerá la propiedad de navegación de los objetos relacionados con null; Si el objeto eliminado es parte de la colección, se elimina el objeto de la colección. No se elimina el objeto eliminado del contexto del objeto y si conoces su ID, pudo encontrar el objeto en la ObjectStateEntry mediante el método GetObjectStateEntry. Si no conoces el ID del objeto, puede registrarse para el evento ObjectStateManagerChanged y realizar la validación cuando cambia el estado del objeto en Deleted. Por ejemplo: 

static void  StateChanged(object  sender, CollectionChangeEventArgs e)
{
if (e.Action == CollectionChangeAction.Remove)
{
var category = e.Element as Category;
if (category != null && category.Products.Count() > 0)
{
throw new  ApplicationException("Cannot delete category because it has products.");
}
}
}

Volver a EF FAQ tabla de contenido