[转]Subsonic: Code-First开发模式
一直以来都在使用数据驱动的开发模式:PD设计数据库模型,然后生成数据库脚本,再然后建立数据库(可能还要写段SQL脚本初始化一点数据),再然后用上个ORM框架,最后开始狂写代码。
实在太枯燥,太麻烦啦。
最近EF更新好像开始支持Code-First模式,看了几篇帖子觉得这才是我想要的开发模式:先写POCO类,然后自动生成数据库(如果是测试,可能这一步都可以暂时不做,然后开始写代码。简单的POCO类比那些充血的实体实在是优雅了好多。别的优点那就更不用说啦,在mvc中直接拿做models层。我实在是太需要这些啦。
不过C在.net中code-First模式不是EF的专有。现在我将用我最喜爱的Subsonic来实现这个功能。Subsonic是一个轻量级的ORM方案,官网上也有很多教程。大家一起来学习下。
首先我胶需要下载Subsonic 3以上的版本,3以下的版本不支持code-first。另外Subsonic 3提供的LinqProvider可以让我们应用Linq进行数据库操作。
首先我们设计一个类:记得引入 Subsonic
{
[SubSonicPrimaryKey]
public int Id { get; set; }
[SubSonicStringLength(50)]
public string UserName { get; set; }
[SubSonicStringLength(50)]
[SubSonicNullString]
public string Role { get; set; }
public bool SystemUser { get; set; }
[SubSonicStringLength(50)]
public string Password { get; set; }
public DateTime Expire { get; set; }
public bool Active { get; set; }
}
注意类属性上的attribution ,它将指定我们在生成数据库时使用何种数据类型及长度等相关信息。
有了这个类,我们怎样让它生成数据库呢,太简单啦,看代码:记得引入 Subsonic
using System;
using SubSonic.Repository;
namespace BuildDBApplication
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("正在为您生成数据库...");
_001_Init build = new _001_Init();
build.init();
Console.WriteLine("生成成功...");
Console.WriteLine("初始化数据...");
//查询和增加数据时可批定SimpleRepositoryOptions.None,意为不更改数据库结构。
var repo = new SimpleRepository("UCerterDB", SimpleRepositoryOptions.None);
UCenter.Entitys.Usr model = new UCenter.Entitys.Usr();
model.UserName = "Ants";
model.Password = "123456";
model.Active = true;
model.Expire =DateTime.Now;
model.SystemUser = true;
repo.Add(model);
Console.WriteLine("完成,请关闭窗口!");
Console.Read();
}
}
internal class _001_Init
{
public void init()
{
//一定要指定SimpleRepositoryOptions.RunMigrations,意为可以更改数据库结构
var repo = new SimpleRepository("UCerterDB", SimpleRepositoryOptions.RunMigrations);
//生成表,查询不到这个表时,它会自动生成表。很简单吧!
var Usr = repo.Single<UCenter.Entitys.Usr>(x => x.Id == 0);
var ticket = repo.Single<UCenter.Entitys.Ticket>(x => x.Id == 0);
}
}
}