.net Entity Framework初识1
利用EF可以直接操纵数据库,在一些简单的项目里甚至完全不用写sql。
一 code first
1、在web.config中设置连接字符串
这一步可以省略。如果跳过这一步,程序会默认生成一个可用的连接字符串,生成的数据库文件放在程序根目录的App_Data中。
<configuration> <connectionStrings> <add name="conn" connectionString="Data Source=数据源; Initial Catalog=数据库; Integrated Security=True; MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" /> <!--MultipleActiveResultSets是设置连接可重用,提高效率--> </connectionStrings> </configuration>
2、在Models中新建一个类Person.cs
1 public class Person 2 { 3 public int ID { get; set; } 4 public string Name { get; set; } 5 public string Remark { get; set; } 6 }
3、在Controllers中新建一个 包含视图的MVC5控制器(使用Entity Framewok)
控制器名称:HomeController
模型类:选择刚刚新建的Person类
数据上下文:点击新建数据上下文,并把默认选中的部分改成所需的名字如,Project
最后勾选 生成视图,点击添加按钮,VS就在为我们搭建基架了。
此时:
Controllers文件夹多了一个HomeController,里面包含了一些增删改查的基本方法;
Models文件夹多了一个ProjectContext.cs文件,里面有个构造函数publicProject():base("name=ProjectContext"),把name改成第一步中连接字符串的name。
Views文件夹多了5个视图。
这时我们打开Index.cshtml视图,运行程序后可以发现,数据库中多了一个库,名字就是web.config中设置的名字,其中有两张表,一个叫__MigrationHistory,一个叫People(本来应该是Person,但是VS自动使用了Person的复数People。最终的标明是依ProjectContext.cs中属性名而定的)。
__MigrationHistory表是EF用来检测模型类的变化。可以放心的删除它,此时EF假设我们知道自己在做什么,。一旦删除它,我们就要手动保持数据库与模型类的匹配。
当模型和数据库不一致时
(一)销毁数据库并重建
在Application_Start()中调用EF的静态方法:
Database.SetInitializer(new DropCreateDatabaseAlways<myProjectContext>()); //每次运行都重建 或者 Database.SetInitializer(new DropCreateDatabaseIfModelChanges<myProjectContext>()); //当模型改变时重建
其中Database类位于Sysem.Data.Entity命名空间下。
销毁并重建数据库将无法保留数据库中的数据,因此这种方法主要是为应用程序生命周期早期阶段的迭代和快速变化提供便利的。
一旦发布一个实际网站并采用真实的客户数据,就不能每次都销毁数据库了。
重新创建的新库,在开发的时候经常需要插入一两条数据进行调试,可以重写DropCreateDatabaseAlways或者DropCreateDatabaseIfModelChanges的Seed方法:
首先在App_Start中新建一个类如下:
1 public class ProjectContextInitializer:DropCreateDatabaseAlways<ProjectContext> 2 { 3 protected override void Seed(ProjectContext context) 4 { 5 context.Person.Add(new Person { Name = "卡特琳娜" }); 6 base.Seed(context); 7 } 8 }
然后在Application_Start()中调用:
Database.SetInitializer(new ProjectContextInitializer());
这样会在每次运行程序时的第一次与数据库交互时,销毁原库、创建新库之后默认插入Seed中的数据。