工作需要详细了解了一下数据库,其实以前选修过,不过没什么实际应用
正好遇到新技术,顺带了解一下。
文章目录
基础概念
T4模版
T4模版是VS自带的一个自定义工具(VS新建- 文本模版)
他的文件格式是.tt和.ttinclude
格式实际上就是C#的变形,具体的语法规则这里不做展开。
大概类似下面这样
<#@ include file="LinqToDB.ttinclude" #>
<#
LinqToDB.DataProvider.SQLite.SQLiteTools.ResolveSQLite(typeof(System.Data.SQLite.SQLiteConnection).Assembly);
{
var beforeGenerateLinqToDBModel = BeforeGenerateLinqToDBModel;
BeforeGenerateLinqToDBModel = () =>
{
ConvertSQLiteMetadata();
beforeGenerateLinqToDBModel();
};
}
#>
<#+
void ConvertSQLiteMetadata()
{
foreach (var t in Tables.Values)
foreach (var fk in t.ForeignKeys.Values)
if (fk.MemberName.Length == 0 || char.IsDigit(fk.MemberName[0]))
fk.MemberName = "FK_" + fk.MemberName;
}
LinqToDB.Data.DataConnection GetSQLiteConnection(string connectionString)
{
return LinqToDB.DataProvider.SQLite.SQLiteTools.CreateDataConnection(connectionString);
}
LinqToDB.Data.DataConnection GetSQLiteConnection(string path, string database)
{
return GetSQLiteConnection(string.Format("Data Source={0}", System.IO.Path.Combine(path, database)));
}
void LoadSQLiteMetadata(string connectionString)
{
var dataConnection = GetSQLiteConnection(connectionString);
LoadMetadata(dataConnection);
}
void LoadSQLiteMetadata(string path, string database)
{
var dataConnection = GetSQLiteConnection(path, database);
LoadMetadata(dataConnection);
}
#>
这段代码作用就是建立和数据库的连接,注意T4模版是运行在代码编译前的,也就是说,工程编译前就会运行T4模版连接数据库,并根据数据库的内部自动生成一个和数据库对应的model类.毕竟T4模版都能连接数据库了,那么生成一个.cs文件也是很容易的。可以看到通过T4模版通过反射自动的创建了一个TestDataDB类,这个类和数据库的结构是完全对应的,包括数据库表,以及表中的字段,也都自动生成了对应的类和属性。
T4模版文件我们可以自己写,但是linq2db默认已经给我们提供了各种数据库的T4模版。
简而言之,T4模版在本篇文章的应用里,主要是进行 Data First 的转换,从数据库自动生成Model(TestDataDb类和对应的表类)
补充:EF实体框架有3种类型,Data First、Model First、Code First ,可以区别了解一下。
所以相对于EF这种重量级的自动框架,linq2db是轻量级的半自动ORM框架(只能Data First,从数据库到Model)。
Linq2db实例
要操作数据库我们首先要连接数据库,这部分我们只要在app.config文件放好我们的连接字符串,
当我们实例化model(TestDataDB)的时候便会自动连接数据库。以微软的Access数据库为例,我们需要修改app.config文件
<configuration>
<connectionStrings>
<add name="TestData" providerName="Access"
connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=....TestData.mdb;Locale Identifier=1033;Jet OLEDB:Engine Type=5;Persist Security Info=True" />
connectionStrings>
然后代码里只要实例化model,linq查询完事。
使用Linq语句
检查Linq生成的SQL
使用SQL语句
class Program
{
static void Main(string[] args)
{
DataConnection.TurnTraceSwitchOn();
DataConnection.WriteTraceLine = (sql, time) => Debug.WriteLine(sql, time);
using (var db = new TestDataDB())
{
var sql = db.Query<Person>("SELECT * FROM Person");
var q =
from c in db.People
select c;
foreach (var c in q)
Console.WriteLine(c.PersonID);
db.Patient_SelectByName("", "");
}
}
}
工程结构
整个VS工程的结构很简单,一个tt模版用于生成对应的model类(TestDataDB) 文件TestData.generated.cs
LinqToDB.Templates是.tt文件中所包含的针对各种数据库的.ttinclude文件,因为不同的数据库建立连接方式不同。
app.config中放置数据库连接字符串,new TestDataDB()时,linq2db库会自动加载.config配置文件中的连接字符串建立数据库表和实体模型的映射关系。
GitHub的sqlite示例
sqlite是 .sqlite 单文件数据库,不需要安装复杂的运行环境。直接使用工程中的Nuget包即可使用 sqlite数据库
是所有例子中最适合快速了解linq2db的。