65.9K
CodeProject 正在变化。 阅读更多。
Home

DLinq 快速入门

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.98/5 (20投票s)

2007 年 9 月 22 日

CPOL

4分钟阅读

viewsIcon

43567

轻松开始使用 DLinq

引言

我将展示在项目中开始使用 DLinq 的步骤。Visual Studio 2008 将内置 LINQ 支持。要与 Visual Studio 2005 一起使用,我们需要下载并安装 LINQ 安装程序。

创建新项目

安装 Linq 设置后,Visual Studio 2005 项目类型树中会添加新的项目类型。现在,我们通过“文件”>“新建项目”菜单添加一个 LINQ 控制台应用程序。

Screenshot - linq_prj.gif

现在,我们在数据库中创建一个表。

CREATE TABLE USERS
(
LogonID nVARCHAR(20) NOT NULL PRIMARY KEY,
Name NVARCHAR(50),
Password NVARCHAR(30),
EmailAddress NVARCHAR(50),
LastLogon DateTime
);

现在,添加我们的映射对象类 User

[Table(Name="users")]
public class User
{
    private string logonID;
    private string name;
    private string password;
    private string emailAddress;
    private DateTime lastLogon;
    public User()
    {
    }
    [Column (Id=true, Storage = "logonID")]
    public string LogonID
    {
        get { return logonID; }
        set { logonID = value; }
    }
    [Column(Storage = "name")]
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    [Column(Storage = "password")]
    public string Password
    {
        get { return password; }
        set { password = value; }
    }
    [Column(Storage = "emailAddress")]
    public string EmailAddress
    {
        get { return emailAddress; }
        set { emailAddress = value; }
    }
    [Column(Storage = "lastLogon")]
    public DateTime LastLogon
    {
        get { return lastLogon; }
        set { lastLogon = value; }
    }
}

我们使用 Table 属性为每个类分配表名。这里我们使用 [Table(Name="users")]User 类分配给“users”表。然后,我们添加带有参数的 Column 属性。我们可以将 Storage 参数分配给实际的类 private 字段。我们有一个布尔 Id 参数,用于将属性分配为 ID 字段。

加载数据

现在我们需要创建一个 DataContext 对象。

DataContext db = new DataContext(
    @"Data Source=localhost\sqlexpress;Initial Catalog=master;Integrated Security=True"
    ); 

我们将数据库连接字符串作为构造函数参数提供。现在,我们创建一个表并从数据库加载所有用户。

Table<User> userTable = db.GetTable<User>();
db.Log = Console.Out;
var users = from c in userTable 
    select c;
foreach (User u in users) { 
    Console.WriteLine(u.LogonID);
}

好的,我们已经完成了。现在,让我们添加一些功能。

插入操作

要插入,我们创建一个映射对象的新实例并将其添加到表中

User u1= new User();
u1.LogonID="manir";
u1.Name="Maruf Maniruzzaman";
u1.Password="1234";
u1.LastLogon=DateTime.Now;
userTable.Add(u1);
db.SubmitChanges();

我们调用 SubmitChanges 来应用更改。

修改操作

首先,我们加载一个用户。

User u2 = userTable.Single(u => u.LogonID == "manir"); 

这等同于

select * from users u where u.LogonID="manir" limit 1

它返回一行。我们现在更改对象的某个属性,然后在数据库中更新该行。

u2.Password="5678";
db.SubmitChanges();

是的,u2 是一个实时对象,如果我们更改它的任何属性并提交,数据库行将相应地更改。

删除操作

这里我们从表中加载对象,并调用 Table Remove 方法进行删除。

User u3 = userTable.Single(u => u.LogonID == "maruf");
userTable.Remove(u3);
db.SubmitChanges();    

需要注意的是,我们可以执行多个操作,然后一次性调用 DataContext 对象的 SubmitChanges 来应用所有更改。因此,接下来是事务管理。

数据库事务

我们希望将之前的操作作为单一原子步骤完成。我们需要管理事务。DLINQ 使这非常简单。只需

db.Connection.Open();
db.LocalTransaction = db.Connection.BeginTransaction();
try
{
    User u1= new User();
    u1.LogonID="manir";
    u1.Name="Maruf Maniruzzaman";
    u1.Password="1234";
    u1.LastLogon=DateTime.Now;
    userTable.Add(u1);

    User u2 = userTable.Single(u => u.LogonID == "sumi"); 
    User u3 = userTable.Single(u => u.LogonID == "maruf");
    
    u2.Password="5678";
    userTable.Remove(u3);
    //We now submit all changes
    db.SubmitChanges();
    //Last statement is commit      
    db.LocalTransaction.Commit();
}catch(Exception ex)
{
    // On any error we rollback everything
    db.LocalTransaction.Rollback();
}
//We are done with the LocalTransaction at this point
db.LocalTransaction = null;

同样(也是一种更好的方式)可以将 db.SubmitChanges() 包装在事务范围内,如下所示:

using(TransactionScope ts = new TransactionScope()) {
        //Do some operations.....
         db.SubmitChanges();
        ts.Complete();
    }

使用设计器

到目前为止,我们都是手动添加映射对象。现在,我们使用 DLinq 设计器来完成这项工作。我们可以从服务器/数据库资源管理器中拖动表来创建映射对象,并使用图形工具在它们之间创建关联(关系)。

首先,我们在项目中添加一个新的DLinqObjects 文件。

Project -> Add New Item -> DLinqObjects

Screenshot - add-designer.gif

将创建一个绘图表面。我们在那里进行绘图。

现在,我们从服务器资源管理器(Server Explorer)的连接树中拖动“users”表并将其放到绘图表面上。表将以图形格式显示。添加项目可能需要的所有表。

Screenshot - design-table.gif

现在构建项目,然后为相应的表生成映射类到后备 C# 文件中。

您可以使用生成的类,就像我们使用手动创建的类一样。您也可以从生成的类创建对象数据源。为此,从“数据”菜单中,选择“添加新数据源”,然后选择“对象”类型,接着从类树中选择类(例如,现在是 User 类)。您可以将其与数据控件一起使用。

SQL Metal - 实体类生成器工具

随着 LINQ 的发布,我们获得了一个实体类生成器。我们可以使用它直接生成实体类,或者生成一个描述元数据的 XML 文件,然后从该 XML 文件中生成实体类。在命令行中,我们使用以下语法:

>sqlmetal [options] [<input file>]

例如

>>sqlmetal /server:localhost\SQLEXPRESS /database:master 
    /namespace:MyPrj /code:users.cs

使用此工具生成实体类并避免重复工作。

自动导出架构

我们可能希望 DLINQ 为我们自动创建数据库架构。一种方法是我们需要继承 DataContext 类,并在其中将所有表定义为 public 成员。所以,我们定义 OurDataContext 类如下:
public class OurDataContext: DataContext 
{ 
    public Table<Users> users; 
    public OurDataContext(string connection) : base(connection) {} 
} 
//....... 
//....... 

//Now call following to export schema...
 
DataContext db = new OurDataContext(
   @"Data Source=localhost\sqlexpress;Initial Catalog=master;Integrated Security=True"
    );
  
db.CreateDatabase(); 

就是这样。它将根据元数据创建 users 表。

好的,这可能只是一个快速入门。我会提供更多信息。我会找时间改进这篇文章(以及其他 3 篇文章)。在发布文章后,我已经做了很多修改。我将向您展示一个实际示例 - 如何设计业务应用程序的数据访问层。但这不可能一步完成。我将边学边写,将 J2EE 的知识与 .NET 进行映射。谢谢。

参考文献

  • LINQ 实操实验
    LINQ 安装文件夹中也有很多文档。这篇文章是对这些文档的总结。
© . All rights reserved.