上一篇 年度开源力作,国产Linq ORM又一框架诞生了,这篇就开始首航之旅
一: 开始NLite.Data Linq Framework 之旅
这个教程演示了如何在微软开发环境里搭建一个NLite.Data例子. 使用了以下工具:
控制台应用程序.
Access 2007 Northwind 数据库, NLite.Data也支持其他数据库,更换数据库要做的仅仅是在配置文件里更改数据库方言和数据库驱动。
Visual Studio .NET 2010- 开发环境.
Nuget使用说明: http://docs.nuget.org/docs/start-here/using-the-package-manager-console
1. 我们创建一个控制台项目.项目命名为QuickStart。 打开项目,添加NHibernate.dll引用。
2. 通过Nuget添加NLite.Data 的引用:在Nuget控制台中输入:install-package nlite.data, Nuget会自动的将你引用的库的这个库的依赖文件添加到你的项目引用中.
3. 配置数据库连接信息。添加App.Config 文件,并添加如下的配置信息
<connectionStrings> <clear/> <add providerName ="System.Data.OleDb" name="Northwind" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Northwind.mdb;Persist Security Info=True"/> </connectionStrings>
providerName:用来指示DbProviderFactory的标志类型,通过它来加载DbProviderFactory,下面我枚举一下常用的providerName
name: 用来标志是哪一个连接字符串,如果项目中需要多个数据库,那么可以添加多个连接字符串配置,这些配置通过name来区别,从而达到支持多数据库的目的
connectionString:存储连接字符串的内容
二:数据表Customers
三:实体类
public class Customer { public string CustomerID; public string ContactName; public string CompanyName; public string Phone; public string City; public string Country; }
四:映射Customers表
首先添加:using NLite.Data;
然后修正第三步的Customer实体类如下:
[Table(Name = "Customers")] public class Customer { [Id] public string CustomerID; [Column] public string ContactName; [Column] public string CompanyName; [Column] public string Phone; [Column] public string City; [Column] public string Country; }
五:与Customer同舞
1. 创建DbConfiguration
DbConfiguration在NLite.Data里面是一个单个数据存储的概念(在SQLServer里面就是对应一个database),多数据库操作可以使用创建多个连接字符串配置以及在程序里创建多个DbConfiguration对象来实现。
var dbConfiguration = DbConfiguration.Configure("Northwind");
DbConfiguration代表一个数据库。 NLite.Data通过对DbConfiguration().Configure(connectionStringName)的调用来初始化DbConfiguration实例。通过DbConfiguration实例创建一个IDbContext。 在创建 IDbContext之前,你可以访问Configuration来设置其他属性(甚至修改映射的元数据)。 我们应该在哪儿创建DbConfiguration,在我们的程序中又如何访问它呢?
DbConfiguration通常只是被初始化一次,比如说在Application_Start事件里来初始化。 这意味着你不应该在ASP.NET页面中把它作为一个实例变量来持有,而应该放在其他地方。进一步的说, 我们需要使用单例(Singleton)模式,我们才能更容易的在程序中访问 DbConfiguration。
2. 注册OR映射
经过了实体类Customer和数据表Customers的映射,现在需要把它们的映射关系注册到DbConfiguration对象中,这样就可以使用IDbSet操作了。
dbConfiguration.AddClass<QuickStart.First.Customer>();
3. 为了方便跟踪Sql输出,注册控制台日志
dbConfiguration.SetSqlLogger(() => new SqlLog(Console.Out));
4. 创建IDbContext
DbContext 里面封装了数据库连接对象,代表一个连接对象,使用完毕后要注意及时释放
using (var ctx = dbConfiguration.CreateDbContext()) { }
5. 创建IDbSet 玩转Linq
var q= ctx.Set<QuickStart.First.Customer>();
1): 添加一条记录
var c = new Customer { CustomerID = "XX1", CompanyName = "Company1", ContactName = "Contact1", City = "Seattle", Country = "USA" }; // 执行PO插入 q.Insert(c);
控制台输出的SQL信息如下:
INSERT INTO [Customers]([CustomerID], [ContactName], [CompanyName], [Phone], [City], [Country]) VALUES (p0, p1, p2, p3, p4, p5) -- p0:(DbType = String,Value = XX1) -- p1:(DbType = String,Value = Contact1) -- p2:(DbType = String,Value = Company1) -- p3:(DbType = String,Value = NULL) -- p4:(DbType = String,Value = Seattle) -- p5:(DbType = String,Value = USA)
2):通过主键查询
var c2 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID); Console.WriteLine(c2.CustomerID);
控制台输出的SQL信息如下:
SELECT TOP 1 t0.[CustomerID], t0.[ContactName], t0.[CompanyName], t0.[Phone], t0.[City], t0.[Country] FROM [Customers] AS t0 WHERE (t0.[CustomerID] = p0) -- p0:(DbType = String,Value = XX1) XX1
3): 基于Linq的局部更新
//基于Linq的局部更新 q.Update(new { CompanyName = "ddd" }, p => p.CustomerID == c.CustomerID); //查询 var c3 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID); Console.WriteLine(c3.CompanyName);
控制台输出的SQL信息如下:
UPDATE [Customers] SET [CompanyName] = p1 WHERE ([CustomerID] = p0) -- p0:(DbType = String,Value = XX1) -- p1:(DbType = String,Value = ddd) SELECT TOP 1 t0.[CustomerID], t0.[ContactName], t0.[CompanyName], t0.[Phone], t0.[City], t0.[Country] FROM [Customers] AS t0 WHERE (t0.[CustomerID] = p0) -- p0:(DbType = String,Value = XX1) ddd
4:) 基于Linq的删除
//基于Linq的删除 q.Delete(p => p.CustomerID == c.CustomerID); var c4 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID); if (c4 != null) Console.WriteLine("Delete failed");
控制台输出的SQL信息如下:
DELETE FROM [Customers] WHERE ([CustomerID] = p0) -- p0:(DbType = String,Value = XX1) SELECT TOP 1 t0.[CustomerID], t0.[ContactName], t0.[CompanyName], t0.[Phone], t0.[City], t0.[Country] FROM [Customers] AS t0 WHERE (t0.[CustomerID] = p0) -- p0:(DbType = String,Value = XX1)
六:全部代码
public static void Main(params string[] args) { var dbConfiguration = DbConfiguration.Configure("Northwind"); dbConfiguration.AddClass<QuickStart.First.Customer>(); dbConfiguration.SetSqlLogger(() => new SqlLog(Console.Out)); using (var ctx = dbConfiguration.CreateDbContext()) { var q = ctx.Set<QuickStart.First.Customer>(); var c = new Customer { CustomerID = "XX1", CompanyName = "Company1", ContactName = "Contact1", City = "Seattle", Country = "USA" }; // 执行PO插入 q.Insert(c); //查询 var c2 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID); Console.WriteLine(c2.CustomerID); //基于Linq的局部更新 q.Update(new { CompanyName = "ddd" }, p => p.CustomerID == c.CustomerID); //查询 var c3 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID); Console.WriteLine(c3.CompanyName); //基于Linq的删除 q.Delete(p => p.CustomerID == c.CustomerID); var c4 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID); if (c4 != null) Console.WriteLine("Delete failed"); } Console.Read(); }
七:总结
在这个短小的教程中,我们对NLite.Data的浅尝即止。NLite.Data作为一个数据库访问层,是与你的程序紧密相关的。 通常情况下,所有其他层次都依赖持久机制。
最后附上Demo代码:http://files.cnblogs.com/netcasewqs/QuickStart.zip
技术支持: 1、在我的博客留言,我会尽可能地抽时间来答复大家的问题。 2、加入 NLite.Data用户的 QQ群(271342583)。3、官方地址:http://ndo.codeplex.com
谢谢大家的阅读,麻烦大伙点一下推荐,再次谢谢大家。 ^_^