好几个其它的Column属性限定了primary-key,non-nullable, auto-increment, timestamp 列, 以及没有作为属性表示出来的entity properties (Table 1)。OnPropertyChanging("PropertyName")将引发Property-Changing事件,该事件把原始的属性值存储到DataContext中,用来和数据库的值进行比较,以此来管理乐观并发。OnPropertyChanged("PropertyName")方法会引起PropertyChanged事件,从而跟踪目前的属性值。
Association把EntityRef(T的)属性和EntitySet(T的)收藏连接起来定义在多对一的表格关系中的对象对等性。Association的属性要比列的属性少,但是要比你在Designer属性页(Table 2)中设置的要多很多。Association的OnProperty-Changing代码要比列的更复杂,这是因为处理过程要求移除原来的并添加一个新的实例,而不是仅仅改变外部键的值(Listing 3)。
大多数O/RM工具都支持三种继承映射策略:每个类层次结构一个表,每个之类一个表,以及每个实体类一个表。LINQ to SQL仅支持每个类层次结构一张表的策略,这种策略需要一个鉴别器列来指定子类。下面的摘录用Shipper-Type鉴别器S和Truck, Rail, Air, 以及 Ocean图表类型来指定Shipper基类:
<Table(Name:="dbo.Shippers", ...)>在这段摘录的代码中,每个类一张表的映射方式需要五张表(基础类和另外的四个子类);每个实体类一张表,则需要四张表。如果域模型要求以上两种映射策略中的一种,可以尝试Entity Framework和它的Entity Data Model,或者主流的.NET O/RM工具之一。在LINQ to NHibernate提供者的支持下,工作可以继续进行。
<InheritanceMapping(Code:="S", _
Type:=GetType(Shipper), IsDefault=True)> _
<InheritanceMapping(Code:="T", _
Type:=GetType(Truck))> _
<InheritanceMapping(Code:="R", _
Type:=GetType(Rail))> _
<InheritanceMapping(Code:="A", _
Type:=GetType(Air))> _
<InheritanceMapping(Code:="O", _
Type:=GetType(Ocean))> _
Partial Public Class Shipper
,,,
<Column(Name:="ShipperType", ... _
IsDiscriminator:=True)> _
Public Property ShipperType() _
As String
...
End Property
End Class
如果需要实体类的自由属性POCO,必须使用SqlMetal.exe命令行工具生成一个ClassName.vb或.cs文件,以及一个带有这种指令的Mapping.xml文件:
SqlMetal /server:oakleaf-vs20\SQLEXPRESS
/database:NwindLINQ
/map:\LINQ2SQLTest\NwindLINQ.xml
/language:vb /namespace:NwindLINQ
/code:\LINQ2SQLTest\NwindLINQ.vb /pluralize
然后用使用了连接字符串和映射文件规范的过载构造器来建立DataContext(本例中是dcNwind):
Private Sub frmLINQ2SQL_Load(ByVal sender _
As System.Object, ByVal e _
As System.EventArgs) _
Handles MyBase.Load
Dim strFile As String = _
"\LINQ2SQL\NwindLINQ.xml"
Dim strConn As String = _
"Data Source=.\SQLEXPRESS;Initial " + _
Catalog=NwindLINQ;" + _
Integrated Security=SSPI"
Dim xmsNwind As XmlMappingSource = _
XmlMappingSource. _
FromXml(File.ReadAllText(strFile))
dcNwind = New NwindLINQ(strConn, xmsNwind)
CustomerBindingSource.DataSource = _
dcNwind.Customers
End Sub