CodeFirst 是ef三种开发模式的一种,代码优先,可以让我们先编写model代码,然后更具model生成数据库
一:先要加入EntityFramework.dll的支持,我们可以添加个空的实体数据模型就会自动引入他了,然后把添加的删除掉
因为我们已经不需要了
二:把需要的实体model新建好
public class UserInfo
{
[Key]
public int Id { get; set; }
[StringLength(256)]
public string UserName { get; set; }
public string Class { get; set; }
//必须字段,与字段长度
[Required]
[StringLength(512)]
public string Lover { get; set; }
public int age { get; set; }
[Required]
public int CompanyId { get; set; }
}
然后需要新建一个类去继承DbContext类,把需要生成数据库的实体加上去
public class MyDbContext : DbContext
{
public MyDbContext() : base("name=Demo")
{
}
public DbSet<UserInfo> UserInfo { get; set; }
public DbSet<Company> Company { get; set; }
}
这里的name=Demo是指定配置文件配置的连接字符串
<connectionStrings>
<add name="Demo" connectionString="Data Source=.;Initial Catalog=TestCodeFirst;Integrated Security=True;" providerName="System.Data.SqlClient" />
</connectionStrings>
三:然后随便进行一些ef操作就会自动生成数据库了
需要进行操作有了触发条件他才会去创建数据库
public MyDbContext myc = new MyDbContext();
protected void Page_Load(object sender, EventArgs e)
{
//有个触发条件他会去检查数据库,看数据库和本地的是否保持一致如果不一致就会去自动更新数据库,很简洁的方式很舒服
var ulist = myc.UserInfo.ToList();
myc.UserInfo.Add(new UserInfo() { UserName="敖润之",Class="西龙王",Lover="旅游" });
myc.SaveChanges();
}
字段限制
表名,主键,范围,字段长度等
//指定表名,不然会自动加上s或者es就是变成复数
[Table("UserInfo")]
public class UserInfo
{
[Key]
public int Id { get; set; }
[Range(18,22,ErrorMessage="年龄必须到18到22之间")]
public int Age { get; set; }
[Required]
[StringLength(256)]
public string Name { get; set; }
[StringLength(512)]
public string Loyyer { get; set; }
}
外键:
http://www.cnblogs.com/farcall/p/4850259.html
http://q.cnblogs.com/q/36468/
延迟加载功能,加载模式
http://q.cnblogs.com/q/36468/
http://www.cnblogs.com/haogj/archive/2011/05/07/2039620.html
更新到数据库
如果我们增加了表,增加了增加修改了表,怎么让修改的改到数据库去
如果改了model直接运行就会报错
需要打开程序包管理控制台输入几个命令
然后输入命令:Enable-Migrations启用数据库迁移
然后会自动生成一个Migrations文件夹
这里我们只是启用了迁移,但不是自动迁移。从提示信息中我们可以看到若要启用自动迁移则要删除Migrations文件夹并在Packge Manager Console中输入
Enable-Migrations –EnableAutomaticMigrations命令或者在Migrations文件夹的Configuration.cs文件中设置AutomaticMigrationsEnabled属性为true即可。
Configuration文件 我们可以在此文件中针对上下文配置迁移行为。
InitialCreate文件 因为我们事先让 Code First 自动创建了一个数据库,这个迁移文件中的代码表示数据库中已创建的对象。该文件文件名包含时间戳,这对于排序十分有帮助。如果尚未创建数据库,则不会将此 InitialCreate 迁移添加到项目中。而是,首次调用 Add-Migration 时,用于创建这些表的代码将为新迁移搭建基架。
2.2 更新数据库
启用迁移之后,在Packge Manager Console中继续输入Update-Database命令来更新数据库,但会发现更新失败。
通过上面的提示信息我们可以知道,要想更新数据库需要启用自动迁移或者使用Add-Migration命令来创建迁移文件。
更改了Model自动更新到数据库
上面的方法需要手动执行命令,我们可以在全局应用程序类的Application_Start去设置如果model有更改就自动更新
protected void Application_Start(object sender, EventArgs e)
{
Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>());
//简单粗暴删除了重建
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDbContext>());
//如果有修改自动更新到数据库
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());
}
改了字段长度了更新到数据库会出现错误
改了字段长度可能会出现数据丢失,ef就不会为我们修改
我们需要先执行一个命令
Add-Migration Initial 命令执行后会生成一个文件,用来记录你更新的是什么,类似日志
综合查阅资料发现:将表中的字段设置为NOT NULL(不为空)、给字段增加Default值(默认值)这样的操作都会给该字段添加约束,增加了这些约束后,在用SQL脚本修改字段类型、删除字段的时候均会发生类似错误,需要查找该字段上已存在的约束,并删除存在的约束,再次执行修改/删除脚本即可。
会添加的约束,在数据库找到删除掉就可以了
有时间加了个字段出现的错误
列名 'CompanyId' 无效。
会提示找不到这个,因为我们设置的自动更新
protected void Application_Start(object sender, EventArgs e)
{
Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>());
//简单粗暴删除了重建
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDbContext>());
//如果有修改自动更新到数据库
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());
}
是更新到最后的一个版本而这个版本是从哪里来的,是从Migrations下面来的
需要我们应该先用命令执行以下Add-Migration AddCompanyId
让他生成以下这个就可以自动更新到数据库了
如果Add-Migration name生成的和数据库的不一致的话
可以自己手动去写那个生成的更改记录和数据库保持一致就可以了
如果记录值差距太大可能就是测试环境什么的可以直接简单粗暴删除了重建
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDbContext>());
可以自己去写个更具model自动生成数据库的
就可以不用那么依赖ef了,而且可以定制很多需要的功能