LINQ to SQL 是一种对象关系映射(ORM)技术,它允许开发者以面向对象的方式操作数据库。开发者可以通过LINQ to SQL设计器创建出与数据库结构相仿的架构。这种映射技术能够管理对象之间的关联关系,例如,当一个对象被添加到另一个对象的子集合时,就会建立主键(PK)和外键(FK)的关系。
例如,一个“客户”对象可能有一个“订单”对象的集合(EntitySet),这是用来表示子关系的类型。在这个关系中,“客户”是数据库中的主键,而“订单”集合则是外键。每当一个新的对象被添加到“订单”实体集中,它就会被排队等待插入数据库,并且被添加到集合中。这样,LINQ to SQL 就管理了“客户”和“订单”之间的关系。如果应用程序更改了另一个对象的主键引用,这个更改也会在相应的集合中进行。
当创建一个新对象时,它并不立即属于上下文。例如:
Order order = new Order();
order.Total = 19.99;
order.Date = DateTime.Now;
在这个时刻,这个对象是独立的,并不在上下文中(它没有被排队插入)。一旦执行了如下操作:
customer.Orders.Add(order)
其中“客户”对象是从数据库中检索出来的,这个新订单就会被排队插入,并作为客户的关系被添加。如果使用标识符,键值会被设置为零,直到提交更改(在对象实际插入时刷新)。在这一点上,关系并没有被验证;然而,如果在调用SubmitChanges时出现主键/外键约束错误,这个错误会通过抛出异常来得知。
LINQ to SQL 提供了一种直观的方式来处理数据库操作,它的优势在于:
要使用LINQ to SQL,开发者需要遵循以下步骤:
数据上下文是LINQ to SQL 的核心,它负责管理数据库连接和事务。以下是创建数据上下文的示例:
public class MyDataContext : DataContext
{
public Table<Customer> Customers;
public Table<Order> Orders;
public MyDataContext(string connection) : base(connection) { }
}
数据类是数据库表的映射。以下是定义数据类的示例:
public class Customer
{
public int CustomerID { get; set; }
public string CustomerName { get; set; }
public EntitySet<Order> Orders { get; set; }
}
public class Order
{
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public decimal Total { get; set; }
public EntityRef<Customer> Customer { get; set; }
}
使用LINQ查询语法来检索数据。以下是查询客户的示例:
using (var context = new MyDataContext(connectionString))
{
var customers = from c in context.Customers
where c.CustomerName == "John Doe"
select c;
}
通过数据上下文来操作数据。以下是插入新订单的示例:
using (var context = new MyDataContext(connectionString))
{
var newOrder = new Order
{
OrderDate = DateTime.Now,
Total = 100.00m
};
context.Orders.InsertOnSubmit(newOrder);
context.SubmitChanges();
}
using (var context = new MyDataContext(connectionString))
{
// Perform data operations here...
context.SubmitChanges();
}