一直以来都在使用数据驱动的开发模式: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
public class Usr { [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); } } }
code-first其实并不神秘。我相信很多人和我一样喜欢这种模式。更多介绍请请看官网。