本主题中的术语“业务逻辑”是指在从数据库中插入、更新或删除数据之前应用于数据的任何自定义规则或验证测试。 业务逻辑有时也称为“业务规则”或“域逻辑”。在 n 层应用程序中,它通常设计为逻辑层,以便独立于呈现层或数据访问层对其进行修改。 数据访问层可以在数据库中任何更新、插入或删除数据之前或之后调用业务逻辑。
业务逻辑可以像架构验证一样简单,以确保字段的类型与表列的类型兼容。 或者,它可以包含一组对象,这些对象以任意复杂的方式进行交互。 这些规则可以作为数据库上的存储过程或内存中对象实现。 无论业务逻辑如何实现,LINQ to SQL 使你能够使用部分类和部分方法将业务逻辑与数据访问代码分开。
LINQ to SQL 如何调用业务逻辑
在设计时手动或使用对象关系设计器或 SQLMetal 生成实体类时,它定义为分部类。 这意味着,在单独的代码文件中,可以定义包含自定义业务逻辑的实体类的另一部分。 在编译时,这两个部分将合并到单个类中。 但是,如果必须使用对象关系设计器或 SQLMetal 重新生成实体类,则可以执行此作,并且不会修改该类的一部分。
定义实体和 DataContext 的分部类包含分部方法。 这些扩展点可以让您在对实体或实体属性进行任何更新、插入或删除操作的前后应用业务逻辑。 分部方法可以视为编译时事件。 代码生成器定义了一个方法签名,并在 get 和 set 属性访问器、DataContext
构造函数,以及某些情况下在调用 SubmitChanges 时的幕后过程中调用这些方法。 但是,如果不实现特定的分部方法,则在编译时会删除对它的所有引用和定义。
在单独的代码文件中编写的实现定义中,可以执行所需的任何自定义逻辑。 可以将分部类本身用作域层,也可以从分部方法的实现定义调用到单独的对象或对象中。 无论哪种方式,业务逻辑都与数据访问代码和表示层代码完全分离。
详细了解扩展性点
下面的示例演示对象关系设计器为 DataContext
具有两个表的类生成的代码的一部分: Customers
和 Orders
。 请注意,为类中的每个表定义 Insert、Update 和 Delete 方法。
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
如果在分部类中实现 Insert、Update 和 Delete 方法,那么当调用 SubmitChanges 时,LINQ to SQL 运行时将调用这些方法,而不是使用其默认方法。 这使您可以覆盖创建/读取/更新/删除操作的默认行为。 有关详细信息,请参阅 演练:自定义实体类的插入、更新和删除行为。
该方法 OnCreated
在类构造函数中调用。
Public Sub New(ByVal connection As String)
MyBase.New(connection, mappingSource)
OnCreated()
End Sub
public MyNorthWindDataContext(string connection) :
base(connection, mappingSource)
{
OnCreated();
}
实体类有三种方法,当实体被创建、加载以及调用 SubmitChanges
进行验证时,LINQ to SQL 运行时将调用这些方法。 实体类还具有每个属性的两个分部方法,一个是在设置属性之前调用的,另一个是调用后调用的。 下面的代码示例演示为 Customer
类生成的一些方法:
#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
在属性设置访问器中调用这些方法,如 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();
}
}
}
在类的自定义部分,编写方法的实现定义。 在 Visual Studio 中,在键入 partial
后,将在类的其他部分中看到方法定义的 IntelliSense。
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.
}
}
有关如何使用分部方法将业务逻辑添加到应用程序的详细信息,请参阅以下主题: