"LINQ to SQL" 这个名字看上去有点古怪,不过换成 "System.Data.Linq",或者更干脆一点叫 "Microsoft ORM for .net",我想你就明白它能干什么了。它的用法和 XPO、Castle ActiveRecord 有那么点相似,通过特性定义实体(Entity),然后使用一个上下文对象(Context)来管理实体的操作。
开发演示
1. 准备相应的数据库。虽然 LINQ to SQL 能通过实体定义来生成数据库,但为了演示方便,我们事先准备好一个简单的数据库。
SQL Server 2005
-------------------------
2. 定义实体类型。
引入 "System.Data.Linq" 后,我们就可以使用一些特定的特性(Attribute)来定义实体。比如用 TableAttribute 定义对应的数据表,用 ColumnAttribute 定义对应的数据列,是不是和 ActiveRecord 很像?本文只是做简单的演示,有关更具体的细节,请参考 MSDN 文档。
3. 创建调用代码。
"LINQ to SQL" 通过 DataContext 和 Table<T> 类型来管理实体的操作行为。
(1) 添加
(2) 查询
(3) 更新
(4) 删除
(5) 刷新
上面的例子虽然很简单,但可以看出其使用方法非常简单。加上 LINQ 语法,可以想象这将对 .net 平台的 ORM 产生深远的影响。
按照惯例,Visual Studio 肯定会提供自动代码生成工具,我们可以使用内置的 "LINQ to SQL File" 将数据表从 Database Explorer 直接拖拽到 Diagram 来生成实体和强类型 DataContext 代码。如果想自己开发代码生成器,那么还有相应的命令行工具(C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\Bin\SqlMetal.exe)可以使用。
开发演示
1. 准备相应的数据库。虽然 LINQ to SQL 能通过实体定义来生成数据库,但为了演示方便,我们事先准备好一个简单的数据库。
SQL Server 2005
-------------------------
2. 定义实体类型。
引入 "System.Data.Linq" 后,我们就可以使用一些特定的特性(Attribute)来定义实体。比如用 TableAttribute 定义对应的数据表,用 ColumnAttribute 定义对应的数据列,是不是和 ActiveRecord 很像?本文只是做简单的演示,有关更具体的细节,请参考 MSDN 文档。
using System.Data.Linq;
[Table(Name="User")]
public class User
{
[Column(Name="Id", IsDBGenerated=true, IsPrimaryKey=true)]
public int Id { get; set; }
[Column(Name="Name")]
public string Name { get; set; }
}
[Table(Name="User")]
public class User
{
[Column(Name="Id", IsDBGenerated=true, IsPrimaryKey=true)]
public int Id { get; set; }
[Column(Name="Name")]
public string Name { get; set; }
}
3. 创建调用代码。
"LINQ to SQL" 通过 DataContext 和 Table<T> 类型来管理实体的操作行为。
(1) 添加
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User u = new User();
u.Name = "Tom";
users.Add(u);
context.SubmitChanges();
}
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User u = new User();
u.Name = "Tom";
users.Add(u);
context.SubmitChanges();
}
(2) 查询
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
var q = (from u in users where u.Name == "tom" select u).First();
Console.WriteLine(q.Name);
}
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
var q = (from u in users where u.Name == "tom" select u).First();
Console.WriteLine(q.Name);
}
(3) 更新
string connStr = @"...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User q = (from u in users where u.Name == "tom" select u).First();
q.Name = "tom2";
context.SubmitChanges();
}
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User q = (from u in users where u.Name == "tom" select u).First();
q.Name = "tom2";
context.SubmitChanges();
}
(4) 删除
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User q = (from u in users where u.Name == "tom2" select u).First();
users.Remove(q);
context.SubmitChanges();
}
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User q = (from u in users where u.Name == "tom2" select u).First();
users.Remove(q);
context.SubmitChanges();
}
(5) 刷新
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
// 创建新用户
User user = new User();
user.Name = "user1";
users.Add(user);
context.SubmitChanges();
// 查询并修改
User q = users.Single<User>(u => u.Name == "user1");
q.Name = "xxxxxx";
context.SubmitChanges();
// 刷新对象
context.Refresh(user, RefreshMode.OverwriteCurrentValues);
Console.WriteLine(user.Name);
}
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
// 创建新用户
User user = new User();
user.Name = "user1";
users.Add(user);
context.SubmitChanges();
// 查询并修改
User q = users.Single<User>(u => u.Name == "user1");
q.Name = "xxxxxx";
context.SubmitChanges();
// 刷新对象
context.Refresh(user, RefreshMode.OverwriteCurrentValues);
Console.WriteLine(user.Name);
}
上面的例子虽然很简单,但可以看出其使用方法非常简单。加上 LINQ 语法,可以想象这将对 .net 平台的 ORM 产生深远的影响。
按照惯例,Visual Studio 肯定会提供自动代码生成工具,我们可以使用内置的 "LINQ to SQL File" 将数据表从 Database Explorer 直接拖拽到 Diagram 来生成实体和强类型 DataContext 代码。如果想自己开发代码生成器,那么还有相应的命令行工具(C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\Bin\SqlMetal.exe)可以使用。