subsonic 3.0 mysql_SubSonic 3.0新特性

1.引言

大多数数据访问程序包提供从“数据库外”访问,意思是这种方式将您的数据库的表在应用程序中用对象表示。这种方式可以在大多数案例中工作,但是关系理论与面向对象编程将变的不一致,即“错误的匹配”。

许多人喜欢只使用类工作,但不想关心数据库的具体实现。为了释放他们的工作,同时又不开放数据库设计内部实现。SubSonic创建了一个免费基类且单独存在的,作为纯粹的CLR对象(也称为POCO)。

如果你是这些人之一,你不需要特别关心的数据库结构的,那么SimpleRepository是给你准备的。

2.使用SimpleRepository

使用Rails的有关工作的有趣的事情之一就是你可以建立从代码和专注于您的应用程序的数据库。许多开发者发现这种非常自由(包括我自己在内)。它的一个缺点,就是你需要学习的迁移代码,你需要知道它是如何工作的。这对我们来说,不是一个好的办法,而是一直希望Rails将“只知道”我们要迁移的东西。

这就是为什么我们想使用SubSonic的自动迁移。这里的目标是,如果您在构造SimpleRepository对象时设置一个标志,告诉它迁移模式:自动创建和同步数据库,其关键是在构造函数中设置适当的选项,如: var repository = new SimpleRepository(SimpleRepositoryOptions.RunMigrations);

设置选项RunMigrations告诉SubSonic在更新或保存数据时同步你的模型对象到数据库。

l添加对SubSonic的引用,这部分非常简单,右键单击您的项目,添加引用,浏览以查找SubSonic的3.0的DLL(SubSonic.Core.dll)。

l本例子使用的是SQLite数据库,添加对System.Data.SQLite的引用

l设置数据库连接字符串

connectionString="Data Source=D:\Program Files\Sqliteman\test.db" providerName="System.Data.SQLite"/>

2.1自动迁移

例如有以下post对象: public class Post

{

public Guid ID { get; set; }

public string Title { get; set; }

public string Body { get; set; }

}

当使用SimpleRepository对象时,设置构造函数选项RunMigrations,他将会自动创建你需要的表。 //基于NorthwindSQLite数据库创建一个repository对象并自动迁移

varrepo = new SubSonic.Repository.SimpleRepository("NorthwindSQLite", SimpleRepositoryOptions.RunMigrations);

//var post = repo.Single(x => x.Title == "My Title");

Post post = new Post();

post.ID = Guid.NewGuid().ToString();

post.Title = "My Title";

post.Body = "My Titlessssssssssssss"; var obj = repo.Add(post);

在这个例子中是不能查询Title是”My Title”的记录,因为没有Post表。执行Single()方法后,SubSonic将运行迁移,并创建表,这样就不会有错误。 当第一次运行,下面的SQL将被执行之前选择: CREATETABLE [Posts] ([ID] uniqueidentifier NOT NULL PRIMARY KEY,[Title] nvarchar(255) NOT NULL,[Body] nvarchar(255) NOT NULL,);ALTERTABLE [Posts]ADDCONSTRAINT PK_Posts_Key PRIMARY KEY([ID])";

1713951.html

请注意,表名是复数(默认),“ID”属性选定为主键(默认)和字符串长度默认为255。

你也可以改变SubSonic生成方法,并使用小的属性设置

Ø主键:如果你调用一列“ID”或“Key”或“[ClassName]ID”,无论它的类型都将是表的主键。如果你想到其他的属性列,你可以使用一个主键属性(“SubSonicPrimaryKey”),SubSonic将使用该列作为主键。

Ø字符串长度:有两种方法告诉SubSonic的如何处理这一点,包括使用属性。第一类是“SubSonicStringLength(int length)”,第二是“SubSonicLongString”为nvarchar(max)或LONGTEXT设置,依赖于您的提供程序。

Ø空:默认为不为null,但你可以修改属性为空类型的。

Ø数值精度:默认值是10精度和2位小数点,但你可以改变,随着“SubSonicNumericPrecision((int precision, int scale)”属性。

Ø忽略属性:你可以使用“SubSonicIgnore”忽略生成的属性。

2.2更新模型

开始部分都是容易的,但是随着你的开发将会更改或移除类的属性,SubSonic将会很好的配合你的改变。

例如,假设你已经添加了PublishDate到您的Post类: public class Post

{

public string ID { get; set; }

public string Title { get; set; }

public string Body { get; set; }

public DateTime PublishDate { get; set; } }

当下次使用SimpleRepository进行(Save/Find/Get)数据操作时,下面的SQL命令将在此之前执行: ALTER TABLE [Posts] ADD DateTime datetime NOT NULL CONSTRAINT DF_Posts_PublishDate DEFAULT ('01/01/0001');UPDATE SubSonicTests SET PublishDate ='01/01/0001';

在这里发生有如下几件事:

第一,增加的列(不可为空,可以通过使用DateTime?)。

第二,默认修改的地方(使用DateTime.MinValue),一个非空列应在生成的时候约定默认值。

UPDATE语句依据设置的默认值处理现有的数据库设置(像SQLite和MySQL或其他数据库)。 另删除的属性将导致列从数据库中删除。

2.3查询

可以通过SimpleRepository对象从数据库中查询数据,甚至于使用LINQ: var repo=new SimpleRepository(SimpleRepositoryOptions.RunMigrations);//see if a record existsboolexists=repo.Exists(x=>x.Title=="My Title");//use IQueryablevar qry=from p in repo.All()where p.Title=="My Title"select p;//get a postvar post=repo.Single(x=>x.Title=="My Title");var post=repo.Single(key);//a lot of postsvar posts=repo.Find(x=>x.Title.StartsWith("M"));//a PagedList of posts - using 10 per pagevar posts=repo.GetPaged(0,10);//sort by titlevar posts=repo.GetPaged("Title",0,10);//add a postvar newKey=repo.Add(post);//add a lot of posts - using a transactionIEnumerable posts=GetABunchOfNewPosts();repo.AddMany(posts);//update a postrepo.Update(post);//update a bunch of posts in a transactionIEnumerable posts=GetABunchOfNewPosts();repo.UpdateMany(posts);//delete a postrepo.Delete(key);//delete a lot of postsrepo.DeleteMany (x=>x.Title.StartsWith("M"));//delete posts using a transactionIEnumerable posts=GetABunchOfNewPosts();repo.DeleteMany(posts);

3.使用ActiveRecord

针对您的数据和数据库ActiveRecord的是最简单,最容易的方法。该模式是,每个实例对应的是一个数据库中的数据行,这意味着每个对象类型可以被认为是你的数据库表。

许多开发人员不喜欢与他们的数据库紧耦合工作,但其他人认为这是非常理想方式,消除了与数据库抽象工作有利于面向对象的“阻抗不匹配”。

SubSonic的ActiveRecord是给你需要的,然后自己决定如何做。你会发现你有能力使用LINQ是如此易用的代码,快速和简单的依据数据库生成代码。

3.1设置模板连接

T4模板创造类文件,需要知道连接字符串。要设置:打开文件名为“Settings.ttinclude”,在@ import语句下面,您会看到三个设置,如下: const string Namespace = "Northwind.Data";const string ConnectionStringName = "Northwind";const string DatabaseName = "Northwind";

主要设置是“ConnectionStringName”, 这告诉SubSonic的使用的哪个数据库连接。Namespace常量用来SubSonic生成代码的命名空间。 注意包含的所有*.tt文件需要匹配您的数据库,如下: //其他文件: MySQL.ttinclude, SQLite.ttinclude

3.2项目中增加T4模板

上述设置完成后,只要将T4模板拖入到您的项目。因为Visual Studio 2008中看到一个“*.tt”文件,它会自动执行它。所以你不必做任何事情,只需要运行程序。

文件列表如下:

²ActiveRecord.tt

²Context.tt

²Settings.ttinclude

²SQLServer.ttinclude OR MySQL.ttinclude OR SQLite.ttinclude

²StoredProcedures.tt (可选项,如果执行存储过程需要添加此文件)

²Structs.tt

如果更改了数据库,只需右键单击ActiveRecord.tt,Context.tt和Structs.tt文件并选择“运行自定义工具”,将会自动执行它们。

3.3查询

使用ActiveRecord的查询非常方便,下面是单元测试的一些例子: //差钱ID=1的默认单条记录var product = Product.SingleOrDefault(x => x.ProductID == 1);//查询ProductID<= 10的记录var products = Product.Find(x => x.ProductID <= 10);//获取服务器端的分页列表var products = Product.GetPaged(0,10);//使用Linq查询var products = from p in Product.All()join od in OrderDetail.All() on p.ProductID equals od.ProductIDselect p;

从上面的代码可以中注意与SubSonic2.0的一些不同。

4.结论

SimpleRepository使用和测试很简单,因为它从SubSonic.Repository.IRepository继承。如果按照注入模式,即传递一个IRepository,那么你可以使用你最喜欢的模拟工具或创建一个假的Repository查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值