博客园  :: 首页  :: 联系 :: 管理

Orcas - LINQ to SQL

Posted on 2007-07-27 16:35  sunrack  阅读(325)  评论(0编辑  收藏  举报
"LINQ to SQL" 这个名字看上去有点古怪,不过换成 "System.Data.Linq",或者更干脆一点叫 "Microsoft ORM for .net",我想你就明白它能干什么了。它的用法和 XPO、Castle ActiveRecord 有那么点相似,通过特性定义实体(Entity),然后使用一个上下文对象(Context)来管理实体的操作。

开发演示

1. 准备相应的数据库。虽然 LINQ to SQL 能通过实体定义来生成数据库,但为了演示方便,我们事先准备好一个简单的数据库。

SQL Server 2005
-------------------------
uploads/200706/14_113838_dlinq1.gif


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; }
}

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();
}

(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);
}

(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();
}

(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();
}

(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);
}

上面的例子虽然很简单,但可以看出其使用方法非常简单。加上 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)可以使用。

uploads/200706/14_114238_dlinq4.gif

uploads/200706/14_113843_dlinq2.gif

uploads/200706/14_113849_dlinq3.gif