Volver a EF FAQ tabla de contenido

¿Cómo escribo lógica personalizada detrás de un "captador" o "establecedor"?


Hay varias opciones disponibles para usted:

Las herramientas de Entity Data Model generan métodos parciales en los descriptores de acceso set de propiedad escalar para cada tipo de entidad. Antes de que el valor se establece, se llama al método parcial de OnPropertyNameChanging. Después de establece el valor, se llama al método parcial de OnPropertyNameChanged. Implementar estos métodos parciales para agregar lógica empresarial. Tenga en cuenta que no hay métodos parciales para los captadores, sólo para los definidores.

También puede suscribirse a los eventos siguientes: EntityObject.PropertyChanging y EntityObject.PropertyChanged. Para obtener más información, consulte Cómo: ejecutar lógica de negocio durante cambios propiedad del escalar  .

Otra opción es usar clases de datos personalizadas con su modelo de datos. Empezando 4 EF puede utilizar POCO para crear clases personalizadas. Para obtener más información, consulte trabajando con entidades POCO  . En EF 3.5 SP1 puede bien derivar clases de EntityObject  , o implementar interfaces en la clase de datos personalizados  .

Empezando 4 EF también podría considerar modificar los archivos de plantilla de T4 desde el cual se genera el código de la capa de objeto. Para obtener más información, consulte Cómo: personalizar la generación de código de objeto capa  .

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

¿Es posible escribir lógica que distingue entre llamadas de código de usuario para la materialización de marco y la clase de datos de la clase?


En EF 4 el ObjectContext.ObjectMaterialized evento se provoca cuando se crea una nueva entidad de datos del origen de datos como parte de una operación de carga o consulta. El evento ocurre después de escalar todos, compleja, y propiedades de referencia se han establecido sobre un objeto, pero antes de que se cargan colecciones. Si existe un objeto con el mismo valor de clave en el contexto del objeto, Entity Framework no volver a crear el objeto y no se planteará este evento. ObjectContext.Attach y AddObject no causará este evento ser disparado.

En EF 3.5 SP1 no existe un sistema que permiten distinguir fácilmente entre casos donde el sistema es materializar una entidad y código de usuario es llamar a un constructor o setter.

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

¿Cómo ejecuto código personalizado en una llamada SaveChanges?


ObjectContext tiene un evento SavingChanges que se desencadena cuando se llama a SaveChanges en el contexto antes de que los cambios se almacenan en la base de datos. También es un método parcial de OnContextCreated que se llama desde el constructor del contexto y puede utilizarse para suscribirse un controlador para este evento. Este controlador de eventos puede utilizarse para aplicar la lógica empresarial que involucra a varias entidades.

Comenzando con 4 EF el método SaveChanges es virtual. Esto significa que puede reemplazar este método directamente en lugar de suscripción para el evento SavingChanges. El Cómo: ejecutar negocios lógica cuando guardar cambios (Entity Framework)  tema muestra diferentes maneras de agregar la lógica empresarial al guardar los cambios.

¿Cómo escribo lógica empresarial que valida las interacciones entre múltiples propiedades de una entidad?


Entity Framework permite crear un método Validate que puede reemplazarse para cada tipo de hormigón en el sistema. Aquí es cómo hacerlo:
  1. Crear un tipo abstracto en su modelo de heredar todos los tipos de hormigón o una interfaz que todas sus entidades implementará en su clase parcial. Agregue a la clase abstracta o interfaz un método Validate que puede reemplazarse en las diferentes clases de hormigón según corresponda.
  2. Crear un controlador de eventos para el evento SavingChanges en el contexto del objeto que se pasa por todas las entidades insertadas o actualizadas (se encuentra examinando el ObjectStateManager) y llama al método Validate. Por ejemplo:


foreach (ObjectStateEntry entry in
((ObjectContext)sender).ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified))
{
IValidator obj = entry.Entity as IValidator;
bool valid = true;
if (obj != null)
valid = obj.Validate();
// If the validation method returns a problem string, raise an error.
if (valid != true)
{
throw new ArgumentException(...);
}
}
}


    Para obtener más información, consulte Cómo: ejecutar negocios lógica cuando guardar cambios  .

    También puede validar los valores de propiedad en los definidores. Sin embargo, tenga en cuenta que el Entity Framework ejecuta definidores de propiedad de un objeto durante la materialización. Si no se valida los datos cargados en la base de datos, obviamente causaría problemas. Si la lógica de validación es cara ejecutar, a continuación, podría haber implicaciones de rendimiento demasiado.

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

    Volver a EF FAQ tabla de contenido