ALinq 入门学习(二)--DataContext
2010-05-01 13:38 贺臣 阅读(3285) 评论(3) 编辑 收藏 举报本系列文章使用SQL Server2005 数据库,.NET 3.5 环境。
首先我们建立一个OA_DB数据库,其中建立了三张表,表结构如下图:
ORM 映射的主要作用使用对象形式操作数据库,那我们如何使用对象形式去操作以上数据库的三张表呢,那这里讲到的的就是DataContext。DataContext 的作用很明确,就和Linq to SQL 中的DataContext 的作用一样: 把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库.当然DataContex 也可以执行sql语句。
下面看看OA_DB 的DataContext源码文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 名字相同的特性源码大致如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2 {
3 // Methods
4 protected DataAttribute();
5
6 // Properties
7 public string Name { get; set; }
8 public string Storage { get; set; }
9
10 // Fields
11 private string a;
12 private string b;
13 }
14
15
上面的代码是通过反编译工具编译出来的,可能与源码有些出入,但是不影响阅读
前面说到过ALinq 的最大特点就是能够兼容多种数据库,而特性ProviderAttribute 就是对于兼容多种数据库起着关键性的作用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 查看数据库的基本属性:
测试代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 也有日志功能:日志分为两种情况:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; 使用这种情况,是将日志输出到指定的日志文件中。