Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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: Adición de validación a clases de entidad