Code First, Database First, Same Time是我理解的asp.net mvc中用到的三种model与数据库对应的方式,肯定是不全面的,理解也有些狭隘,今后随着自己的理解加深再来修改这篇帖子吧。这三种方式在格斗人网 (www.helpqy.com)中有应用,这里来自我总结一下:
【Code First】
即先写好模型类,然后通过EF自动生成数据库及相应的表。使用MVC自动创建的模板页时,实际上就使用了Code First。当你打开新建工程的时候可以看到,是没有数据库存在的,当你在运行的页面中注册新账号时,系统会自动根据web.config中的配置、ApplicationDbContext中设置的连接字符串以及模型类来生成数据库和表。至于具体怎么生成的,在我的另外一篇帖子里【将SQL SERVER数据库改成MySql】有具体的实现代码,实际上是通过数据库的Initilizer类来创建数据库的。
通过这种方式创建的数据库,在模型类中的成员被修改后,还可以通过VS的"程序包管理器控制台"来同步到数据库,只需要采用数据迁移中的Enable-Migrations, Add-Migrations "XXX"和Update-Database三个步骤即可实现数据库和模型类的同步。
【Database First】
即先创建好数据库和表,然后新建ADO.NET实体数据模型文件edmx,根据VS的引导,选择已经创建好的数据库的某一个表作为数据源,模型类会被自动创建出来。
【Same Time】
Same Time 是我自己想出的词儿,很不专业,就是自己的一个总结。即在代码侧,模型中的ApplicationUser已经创建好了,想另外增加其它的类以及在已有数据库中创建对应的表,这时需要注意一下几点:
(1) 在类的顶部加上[Table('"xxxx表名")]以让该类与表相关。
(2) 在主键字段前面加上[Key]属性。
(3) 如果表中存在多个主键,在主键上除开添加[Key]属性以外,还需要添加[Column(Order = XX列号)]属性,以表明不同主键的顺序。否则会出现“无法确定组合主键排序”的错误。
(4) 新增加的类可以不用放在ApplicationDbContext中,可以创建DataContext来建立Context模型,然后通过linq to sql来访问,但是在实际部署时,这种方式会出现访问冲突错误,因此还是建议在ApplicationDbContext中,定义该新建模型类的DbSet,然后通过ApplicationDbContext这个统一的入口来访问。