Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menjelaskan kemampuan serialisasi LINQ ke SQL. Paragraf berikut memberikan informasi tentang cara menambahkan serialisasi selama pembuatan kode pada waktu desain dan perilaku serialisasi runtime LINQ ke kelas SQL.
Anda dapat menambahkan kode serialisasi pada waktu desain dengan salah satu metode berikut:
Di Object Relational Designer, ubah properti Mode Serialisasi menjadi Unidirectional.
Pada baris perintah SQLMetal, tambahkan opsi /serialisasi . Untuk informasi selengkapnya, lihat SqlMetal.exe (Alat Pembuatan Kode).
Gambaran Umum
Kode yang dihasilkan oleh LINQ ke SQL menyediakan kemampuan pemuatan yang ditangguhkan secara default. Pemrosesan tertunda sangat praktis pada lapisan menengah untuk pemrosesan data secara transparan sesuai permintaan. Namun, ini bermasalah untuk serialisasi, karena serializer memicu terjadinya pemuatan tertunda baik pemuatan tertunda memang dimaksudkan atau tidak. Akibatnya, ketika sebuah objek diserialisasikan, penutupan transitifnya berdasarkan semua referensi yang pemuatannya ditunda akan diserialisasikan.
Fitur serialisasi LINQ ke SQL mengatasi masalah ini, terutama melalui dua mekanisme:
DataContext Mode untuk mematikan pemuatan yang ditangguhkan (ObjectTrackingEnabled). Untuk informasi selengkapnya, lihat DataContext .
Peralihan pembuatan kode untuk menghasilkan System.Runtime.Serialization.DataContractAttribute atribut dan System.Runtime.Serialization.DataMemberAttribute pada entitas yang dihasilkan. Aspek ini, termasuk perilaku kelas yang pembebanannya ditunda dalam proses serialisasi, merupakan pokok bahasan utama dalam topik ini.
Definisi
Serializer DataContract: Serializer default yang digunakan oleh komponen Windows Communication Framework (WCF) dari .NET Framework 3.0 atau versi yang lebih baru.
Serialisasi unidirectional: Versi berseri kelas yang hanya berisi properti asosiasi satu arah (untuk menghindari siklus). Menurut konvensi, properti di sisi induk hubungan kunci primer-asing ditandai untuk serialisasi. Sisi lain dalam asosiasi dua arah tidak diserialisasikan.
Serialisasi unidirectional adalah satu-satunya jenis serialisasi yang didukung oleh LINQ ke SQL.
Contoh Kode
Kode berikut menggunakan kelas-kelas tradisional Customer dan Order dari database sampel Northwind, dan menunjukkan bagaimana kelas-kelas ini ditandai dengan atribut serialisasi.
// The class is decorated with the DataContract attribute.
[Table(Name="dbo.Customers")]
[DataContract()]
public partial class Customer : INotifyPropertyChanging, INotifyPropertyChanged
{
' The class is decorated with the DataContract attribute.
<Table(Name:="dbo.Customers"), _
DataContract()> _
Partial Public Class Customer
Implements System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged
// Private fields are not decorated with any attributes, and are
// elided.
private string _CustomerID;
// Public properties are decorated with the DataMember
// attribute and the Order property specifying the serial
// number. See the Order class later in this topic for
// exceptions.
public Customer()
{
this.Initialize();
}
[Column(Storage="_CustomerID", DbType="NChar(5) NOT NULL", CanBeNull=false, IsPrimaryKey=true)]
[DataMember(Order=1)]
public string CustomerID
{
get
{
return this._CustomerID;
}
set
{
if ((this._CustomerID != value))
{
this.OnCustomerIDChanging(value);
this.SendPropertyChanging();
this._CustomerID = value;
this.SendPropertyChanged("CustomerID");
this.OnCustomerIDChanged();
}
}
}
' Private fields are not decorated with any attributes,
' and are elided.
Private _CustomerID As String
' Public properties are decorated with the DataMember
' attribute and the Order property specifying the
' serial number. See the Order class later in this topic
' for exceptions
<Column(Storage:="_CustomerID", DbType:="NChar(5) NOT NULL", CanBeNull:=false, IsPrimaryKey:=true), _
DataMember(Order:=1)> _
Public Property CustomerID() As String
Get
Return Me._CustomerID
End Get
Set
If ((Me._CustomerID = value) _
= false) Then
Me.OnCustomerIDChanging(value)
Me.SendPropertyChanging
Me._CustomerID = value
Me.SendPropertyChanged("CustomerID")
Me.OnCustomerIDChanged
End If
End Set
End Property
// The following Association property is decorated with
// DataMember because it is the parent side of the
// relationship. The reverse property in the Order class
// does not have a DataMember attribute. This factor
// prevents a 'cycle.'
[Association(Name="FK_Orders_Customers", Storage="_Orders", OtherKey="CustomerID", DeleteRule="NO ACTION")]
[DataMember(Order=13)]
public EntitySet<Order> Orders
{
get
{
return this._Orders;
}
set
{
this._Orders.Assign(value);
}
}
' The following Association property is decorated with
' DataMember because it is the parent side of the
' relationship. The reverse property in the Order
' class does not have a DataMember attribute. This
' factor prevents a 'cycle.'
<Association(Name:="FK_Orders_Customers", Storage:="_Orders", OtherKey:="CustomerID", DeleteRule:="NO ACTION"), _
DataMember(Order:=13)> _
Public Property Orders() As EntitySet(Of [Order])
Get
Return Me._Orders
End Get
Set(ByVal value As EntitySet(Of [Order]))
Me._Orders.Assign(Value)
End Set
End Property
Untuk kelas Order dalam contoh berikut, hanya properti asosiasi terbalik yang sesuai dari kelas Customer yang ditampilkan untuk kesingkatannya. Ini tidak memiliki DataMemberAttribute atribut untuk menghindari siklus.
// The class for the Orders table is also decorated with the
// DataContract attribute.
[Table(Name="dbo.Orders")]
[DataContract()]
public partial class Order : INotifyPropertyChanging, INotifyPropertyChanged
' The class for the Orders table is also decorated with the
' DataContract attribute.
<Table(Name:="dbo.Orders"), _
DataContract()> _
Partial Public Class [Order]
Implements System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged
// Private fields for the Orders table are not decorated with
// any attributes, and are elided.
private int _OrderID;
// Public properties are decorated with the DataMember
// attribute.
// The reverse Association property on the side of the
// foreign key does not have the DataMember attribute.
[Association(Name = "FK_Orders_Customers", Storage = "_Customer", ThisKey = "CustomerID", IsForeignKey = true)]
public Customer Customer
' Private fields for the Orders table are not decorated with
' any attributes, and are elided.
Private _CustomerID As String
' Public properties are decorated with the DataMember
' attribute.
' The reverse Association property on the side of the
' foreign key does not have the DataMember attribute.
<Association(Name:="FK_Orders_Customers", Storage:="_Customer", ThisKey:="CustomerID", IsForeignKey:=true)> _
Public Property Customer() As Customer
Cara Menserialisasi Entitas
Anda dapat membuat serialisasi entitas dalam kode yang ditampilkan di bagian sebelumnya sebagai berikut;
Northwnd db = new Northwnd(@"c\northwnd.mdf");
Customer cust = db.Customers.Where(c => c.CustomerID ==
"ALFKI").Single();
DataContractSerializer dcs =
new DataContractSerializer(typeof(Customer));
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
dcs.WriteObject(writer, cust);
writer.Close();
string xml = sb.ToString();
Dim db As New Northwnd("...")
Dim cust = (From c In db.Customers _
Where c.CustomerID = "ALFKI").Single
Dim dcs As New DataContractSerializer(GetType(Customer))
Dim sb As StringBuilder = New StringBuilder()
Dim writer As XmlWriter = XmlWriter.Create(sb)
dcs.WriteObject(writer, cust)
writer.Close()
Dim xml As String = sb.ToString()
Hubungan Self-Recursive
Hubungan rekursif diri sendiri mengikuti pola yang sama. Properti asosiasi yang sesuai dengan kunci asing tidak memiliki DataMemberAttribute atribut, sedangkan properti induk tidak.
Pertimbangkan kelas berikut yang memiliki dua hubungan rekursif mandiri: Employee.Manager/Reports dan Employee.Mentor/Mentees.
// No DataMember attribute.
public Employee Manager;
[DataMember(Order = 3)]
public EntitySet<Employee> Reports;
// No DataMember
public Employee Mentor;
[DataMember(Order = 5)]
public EntitySet<Employee> Mentees;
' No DataMember attribute
Public Manager As Employee
<DataMember(Order:=3)> _
Public Reports As EntitySet(Of Employee)
' No DataMember attribute
Public Mentor As Employee
<DataMember(Order:=5)> _
Public Mentees As EntitySet(Of Employee)