Compartir a través de


Implementación de lógica de negocios (LINQ to SQL)

El término "lógica de negocios" de este tema hace referencia a cualquier regla personalizada o pruebas de validación que aplique a los datos antes de insertarlos, actualizarlos o eliminarlos de la base de datos. La lógica de negocios también se conoce a veces como "reglas de negocios" o "lógica de dominio". En las aplicaciones de n niveles, normalmente se diseña como una capa lógica para que se pueda modificar independientemente de la capa de presentación o la capa de acceso a datos. La lógica de negocios se puede invocar mediante la capa de acceso a datos antes o después de cualquier actualización, inserción o eliminación de datos en la base de datos.

La lógica de negocios puede ser tan sencilla como una validación de esquema para asegurarse de que el tipo del campo es compatible con el tipo de la columna de tabla. O bien, puede constar de un conjunto de objetos que interactúan de maneras arbitrariamente complejas. Las reglas se pueden implementar como procedimientos almacenados en la base de datos o como objetos en memoria. Sea cual sea el modo de implementación de la lógica de negocios, LINQ to SQL te permite usar clases parciales y métodos parciales para separar la lógica de negocios del código de acceso a datos.

Cómo LINQ to SQL invoca la lógica de negocios

Al generar una clase de entidad en tiempo de diseño, ya sea manualmente o mediante el Diseñador relacional de objetos o SQLMetal, se define como una clase parcial. Esto significa que, en un archivo de código independiente, puede definir otra parte de la clase de entidad que contiene la lógica de negocios personalizada. En tiempo de compilación, las dos partes se combinan en una sola clase. Pero si tiene que volver a generar las clases de entidad mediante el Diseñador relacional de objetos o SQLMetal, puede hacerlo y su parte de la clase no se modificará.

Las clases parciales que definen entidades y el DataContext contienen métodos parciales. Se trata de los puntos de extensibilidad que puede usar para aplicar su lógica empresarial antes y después de cualquier actualización, inserción o eliminación de una entidad o propiedad de la entidad. Los métodos parciales se pueden considerar como eventos en tiempo de compilación. El generador de código define una firma de método y llama a los métodos de los descriptores de acceso get y set de la propiedad, al constructor DataContext y, en algunos casos, en segundo plano, se llama a SubmitChanges. Sin embargo, si no implementa un método parcial determinado, todas las referencias a él y la definición se quitan en tiempo de compilación.

En la definición de implementación que escriba en el archivo de código independiente, puede realizar cualquier lógica personalizada necesaria. Puede utilizar su clase parcial por sí misma como la capa de dominio, o puede llamar desde la definición de implementación del método parcial a un objeto o varios objetos independientes. En cualquier caso, la lógica de negocios está separada limpiamente del código de acceso a datos y del código de la capa de presentación.

Un vistazo más detallado a los puntos de extensibilidad

En el ejemplo siguiente se muestra parte del código generado por el Diseñador relacional de objetos para la DataContext clase que tiene dos tablas: Customers y Orders. Tenga en cuenta que los métodos Insert, Update y Delete se definen para cada tabla de la clase .

Partial Public Class Northwnd  
    Inherits System.Data.Linq.DataContext  
  
    Private Shared mappingSource As _  
        System.Data.Linq.Mapping.MappingSource = New _  
        AttributeMappingSource  
  
    #Region "Extensibility Method Definitions"  
    Partial Private Sub OnCreated()  
    End Sub  
    Partial Private Sub InsertCustomer(instance As Customer)  
    End Sub  
    Partial Private Sub UpdateCustomer(instance As Customer)  
    End Sub  
    Partial Private Sub DeleteCustomer(instance As Customer)  
    End Sub  
    Partial Private Sub InsertOrder(instance As [Order])  
    End Sub  
    Partial Private Sub UpdateOrder(instance As [Order])  
    End Sub  
    Partial Private Sub DeleteOrder(instance As [Order])  
    End Sub  
    #End Region  
public partial class MyNorthWindDataContext : System.Data.Linq.DataContext  
    {  
        private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();  
  
        #region Extensibility Method Definitions  
        partial void OnCreated();  
        partial void InsertCustomer(Customer instance);  
        partial void UpdateCustomer(Customer instance);  
        partial void DeleteCustomer(Customer instance);  
        partial void InsertOrder(Order instance);  
        partial void UpdateOrder(Order instance);  
        partial void DeleteOrder(Order instance);  
        #endregion  

Si implementa los métodos Insert, Update y Delete en su clase parcial, el motor de ejecución de LINQ to SQL los llamará en lugar de sus propios métodos predeterminados al llamar a SubmitChanges. Esto le permite invalidar el comportamiento predeterminado para las operaciones de creación, lectura, actualización y eliminación. Para obtener más información, consulte Tutorial: Personalización del comportamiento de inserción, actualización y eliminación de clases de entidad.

Al método OnCreated se le llama en el constructor de la clase.

Public Sub New(ByVal connection As String)  
    MyBase.New(connection, mappingSource)  
    OnCreated()  
End Sub  
public MyNorthWindDataContext(string connection) :  
            base(connection, mappingSource)  
        {  
            OnCreated();  
        }  

Las clases de entidad tienen tres métodos a los que llama el entorno de ejecución de LINQ to SQL cuando la entidad se crea, se carga y se valida (cuando se llama a SubmitChanges). Las clases de entidad también tienen dos métodos parciales para cada propiedad, uno al que se llama antes de establecer la propiedad y otro al que se llama después. En el ejemplo de código siguiente se muestran algunos de los métodos generados para la Customer clase :

#Region "Extensibility Method Definitions"  
    Partial Private Sub OnLoaded()  
    End Sub  
    Partial Private Sub OnValidate(action As _  
        System.Data.Linq.ChangeAction)  
    End Sub  
    Partial Private Sub OnCreated()  
    End Sub  
    Partial Private Sub OnCustomerIDChanging(value As String)  
    End Sub  
    Partial Private Sub OnCustomerIDChanged()  
    End Sub  
    Partial Private Sub OnCompanyNameChanging(value As String)  
    End Sub  
    Partial Private Sub OnCompanyNameChanged()  
    End Sub  
' ...Additional Changing/Changed methods for each property.  
#region Extensibility Method Definitions  
    partial void OnLoaded();  
    partial void OnValidate();  
    partial void OnCreated();  
    partial void OnCustomerIDChanging(string value);  
    partial void OnCustomerIDChanged();  
    partial void OnCompanyNameChanging(string value);  
    partial void OnCompanyNameChanged();  
// ...additional Changing/Changed methods for each property  

Se llama a los métodos en el descriptor de acceso set de la propiedad, como se muestra en el ejemplo siguiente para la propiedad CustomerID:

Public Property CustomerID() As String  
    Set  
        If (String.Equals(Me._CustomerID, value) = False) Then  
            Me.OnCustomerIDChanging(value)  
            Me.SendPropertyChanging()  
            Me._CustomerID = value  
            Me.SendPropertyChanged("CustomerID")  
            Me.OnCustomerIDChanged()  
        End If  
    End Set  
End Property  
public string CustomerID  
{  
    set  
    {  
        if ((this._CustomerID != value))  
        {  
            this.OnCustomerIDChanging(value);  
            this.SendPropertyChanging();  
            this._CustomerID = value;  
            this.SendPropertyChanged("CustomerID");  
            this.OnCustomerIDChanged();  
        }  
     }  
}  

En tu parte de la clase, escribes una definición de implementación del método. En Visual Studio, después de escribir partial, puede ver IntelliSense para las definiciones de los métodos en la otra parte de la clase.

Partial Public Class Customer  
    Private Sub OnCustomerIDChanging(value As String)  
        ' Perform custom validation logic here.  
    End Sub  
End Class  
partial class Customer
    {  
        partial void OnCustomerIDChanging(string value)  
        {  
            //Perform custom validation logic here.  
        }  
    }  

Para obtener más información sobre cómo agregar lógica de negocios a la aplicación mediante métodos parciales, consulte los temas siguientes:

Cómo: Agregar validación a clases de entidad

Tutorial: Personalización del comportamiento de inserción, actualización y eliminación de clases de entidad

Tutorial: Adición de validación a clases de entidad

Consulte también