代码改变世界

ALinq 入门学习(二)--DataContext

2010-05-01 13:38  贺臣  阅读(3280)  评论(3编辑  收藏  举报

 1.       ALinq DataContext简介

本系列文章使用SQL Server2005 数据库,.NET 3.5 环境。

首先我们建立一个OA_DB数据库,其中建立了三张表,表结构如下图:


ORM 映射的主要作用使用对象形式操作数据库,那我们如何使用对象形式去操作以上数据库的三张表呢,那这里讲到的的就是DataContextDataContext 的作用很明确,就和Linq to SQL 中的DataContext 的作用一样: 把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库.当然DataContex 也可以执行sql语句。

下面看看OA_DB DataContext源码文件:

ALinq DataContext
 1 [ALinq.Mapping.DatabaseAttribute(Name="OA_DB")]
 2     [ALinq.Mapping.ProviderAttribute(typeof(ALinq.SqlClient.Sql2000Provider))]
 3     public partial class OA_DBDataContext : ALinq.DataContext
 4     {
 5         
 6         private static ALinq.Mapping.MappingSource mappingSource = new ALinq.Mapping.AttributeMappingSource();
 7         
 8     #region Extensibility Method Definitions
 9     partial void OnCreated();
10     partial void InsertTabMenu(TabMenu instance);
11     partial void UpdateTabMenu(TabMenu instance);
12     partial void DeleteTabMenu(TabMenu instance);
13     partial void InsertTabUser(TabUser instance);
14     partial void UpdateTabUser(TabUser instance);
15     partial void DeleteTabUser(TabUser instance);
16     partial void InsertTabRole(TabRole instance);
17     partial void UpdateTabRole(TabRole instance);
18     partial void DeleteTabRole(TabRole instance);
19     #endregion
20         
21         public OA_DBDataContext() : 
22                 base("Data Source=C23471744F6D4BC\\SQLEXPRESS;Initial Catalog=OA_DB;Integrated Security=" +
23                         "True", mappingSource)
24         {
25             OnCreated();
26         }
27         
28         public OA_DBDataContext(string connection) : 
29                 base(connection, mappingSource)
30         {
31             OnCreated();
32         }
33         
34         public OA_DBDataContext(System.Data.IDbConnection connection) : 
35                 base(connection, mappingSource)
36         {
37             OnCreated();
38         }
39         
40         public OA_DBDataContext(string connection, ALinq.Mapping.MappingSource mappingSource) : 
41                 base(connection, mappingSource)
42         {
43             OnCreated();
44         }
45         
46         public OA_DBDataContext(System.Data.IDbConnection connection, ALinq.Mapping.MappingSource mappingSource) : 
47                 base(connection, mappingSource)
48         {
49             OnCreated();
50         }
51         
52         public ALinq.Table<TabMenu> TabMenu
53         {
54             get
55             {
56                 return this.GetTable<TabMenu>();
57             }
58         }
59         
60         public ALinq.Table<TabUser> TabUser
61         {
62             get
63             {
64                 return this.GetTable<TabUser>();
65             }
66         }
67         
68         public ALinq.Table<TabRole> TabRole
69         {
70             get
71             {
72                 return this.GetTable<TabRole>();
73             }
74         }
75     }

 

 

OA_DBDataContext 继承ALinq.DataContext,它和System.Data.Linq.DataContext 的作用大同小异,只是命名空间的不同。

ALinq 中的DataContext使用了两个特性来修饰,其中和Linq to SQL 名字相同的特性源码大致如下:

DataAttribute
 1 public abstract class DataAttribute : Attribute
 2 {
 3       // Methods
 4       protected DataAttribute();
 5 
 6       // Properties
 7       public string Name { getset; }
 8       public string Storage { getset; }
 9 
10       // Fields
11       private string a;
12       private string b;
13 }
14  
15 

 

 上面的代码是通过反编译工具编译出来的,可能与源码有些出入,但是不影响阅读

前面说到过ALinq 的最大特点就是能够兼容多种数据库,而特性ProviderAttribute 就是对于兼容多种数据库起着关键性的作用。

ProviderAttribute
 1 [AttributeUsage(AttributeTargets.Class)]
 2 public sealed class ProviderAttribute : Attribute
 3 {
 4       // Methods
 5       public ProviderAttribute();
 6       public ProviderAttribute(Type type);
 7 
 8       // Properties
 9       public Type Type { get; }
10 
11       // Fields
12       private Type a;
13 }
14  
15 

 

 

2.       ALinq DataContext使用

DataContext 查看数据库的基本属性:

测试代码:

DataContext 属性测试代码
 1 static void Main(string[] args)
 2         {
 3             string connectionString = @"server=C23471744F6D4BC\SQLEXPRESS;database=OA_DB;Integrated Security=true";
 4             OA_DBDataContext context = new OA_DBDataContext(new SqlConnection(connectionString));
 5             Console.WriteLine("数据库是否存在:" + context.DatabaseExists());
 6             Console.WriteLine("请求超时时间:" + context.CommandTimeout);
 7             Console.WriteLine("数据库连接字符串:" + context.Connection.ConnectionString);
 8             Console.WriteLine("数据库连接超时时间:" + context.Connection.ConnectionTimeout);
 9             Console.WriteLine("数据库名称:" + context.Mapping.DatabaseName);
10             
11         } 

 

 

测试结果:

 

3.       ALinq DataContext 日志

Linq to SQL 有日志功能,其实ALInq 也有日志功能:日志分为两种情况:

ALinq 日志功能测试
 1 static void Main(string[] args)
 2         {
 3             string connectionString = @"server=C23471744F6D4BC\SQLEXPRESS;database=OA_DB;Integrated Security=true";
 4             OA_DBDataContext context = new OA_DBDataContext(new SqlConnection(connectionString));
 5             Console.WriteLine("数据库是否存在:" + context.DatabaseExists());
 6             Console.WriteLine("请求超时时间:" + context.CommandTimeout);
 7             Console.WriteLine("数据库连接字符串:" + context.Connection.ConnectionString);
 8             Console.WriteLine("数据库连接超时时间:" + context.Connection.ConnectionTimeout);
 9             Console.WriteLine("数据库名称:" + context.Mapping.DatabaseName);
10 
11             StreamWriter sw = new StreamWriter("log.txt"true);
12             context.Log = Console.Out;
13             var linq = from c in context.TabMenu select c;
14             context.Log.Write(linq.ToString());
15             sw.Close();
16         } 

 

我们看到 context.Log = Console.Out; 这个里面在控制台输出了linq 查询的sql语句。

日志测试结果

 

还有一种情况是context.Log = sw; 使用这种情况,是将日志输出到指定的日志文件中。


作者:情缘
出处:http://www.cnblogs.com/qingyuan/
关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
联系方式: 个人QQ  821865130 ; 仓储技术QQ群 88718955,142050808 ;
吉特仓储管理系统 开源地址: https://github.com/hechenqingyuan/gitwms