基架和实体框架 EF(Entity Framework)是一个对象关系映射框架,可以在关系型数据库中保存对象,也可以利用LINQ
查询语句检索那些保存关系型数据库中的.NET对象
我们之前所建的模型类中所有的属性都是虚属性,意思就是该属性不是必须的,但是它们给EF提供一个指向纯C#类集的钩
子,并为EF启用了一些特性,EF需要知道模型属性值的修改时刻,在这一刻生成UPDate语句,使这些改变和数据库保持一致.
代码优先约定
EF对于外键关系、数据库名称等有约定,这些约定取代了以前需要提供给一个关系对象映射框架的所有映射和配置
DbContext
在使用代码优先约定时,需要使用从EF的DbContext类派生出一个类来访问数据库.该类可以有一个以上的的DbSet<T>类
型的字段,类型DbSet<T>的每一个T代表一个想要持久保存的对象
执行基架模板
1、数据上下文
上文提到的从DbContext类继承而来的类,如下:
public class MusicStoreDB : DbContext
{
/// <summary>
/// 用来存储Album类型的对象,相当于数据库中的Album表
/// </summary>
public DbSet<Album> Albums
{
get;
set;
}
/// <summary>
/// 用来存储Artist类型的对象,相当于数据库中的Artist
/// </summary>
public DbSet<Artist> Artists
{
get;
set;
}
/// <summary>
/// 用来存储Genre类型的对象,相当于数据库中的Genre表
/// </summary>
public DbSet<Genre> Genres
{
get;
set;
}
}
如果需要访问数据库,只需要实例化这个数据上下文类即可.
2、加载相关对象
① 预加载:尽其所能的使用查询语句加载所有数据
② 延迟加载:根据需求来 加载相关数据
执行基架代码
1、用实体框架创建数据库
EF的代码优先尽可能的使用约定而非配置,如果不配置从模型到数据库表的映射,EF将用约定创建一个数据库模式,如果
不配置具体数据库连接,则EF按约定自己创建一个连接
EF连接到服务器,如果找不到数据库则会创建一个数据库,该数据库中EdmMetadata表是EF用来确保模型类和数据库模式
同步的.如果修改模型类如添加或删除模型类的一个属性,那么EF要不根据模型类重新创建数据库,要不报出就抛出异常.
2、使用数据库初始化器
保持数据库和模型变化同步的一个简单方法是允许实体框架重新创建一个现有的数据库可以告知EF在应用程序每次重启
或者检测到模型变化时重建数据库.
调用EF的Database类静态的SetInitializer方法时,需要为其传递一个IDataBaseInitializer对象,而框架中带有 两个
DatabaseInitializer对象:DropCreateDatabaseAlways和 DropCreateDatabaseIfModelChanges,两个初始化器都需要一个
泛型类的参数,并且这个参数必须是DbContext的派生 类:
示例:在每次启动程序时设置一个初始化器
在global.asax.cs内部Application_Star()方法中添加一句代码
Database.SetInitializer(new DropCreateDatabaseAlways<MusicStoreDB>)());
3、播种数据库
如果需要在程序运行时有一些初始数据,可以创建DropCreateDatabaseAlways类并重写Seed方法
如下:
public class MusicStoreDbInitializer : DropCreateDatabaseAlways<MusicStoreDB>
{
/// <summary>
/// 重写Seed方法为程序提供原始数据
/// </summary>
/// <param name=“context”></param>
protected override void Seed(MusicStoreDB context)
{
context.Artists.Add(new Artist
{
Name = "Olive"
});
context.Genres.Add(new Genre
{
Name = "Classic"
});
context.Albums.Add(new Album
{
Artist = new Artist
{
Name = “Only”
},
Genre = new Genre
{
Name = "Pop"
},
Price = 9.99m,
Title = "Only for you"
});
base.Seed(context);
}
这个时候我们还需要在Application_Start事件中添加如下代码:
Database.SetInitializer(new MusicStoreDbInitializer());
总的来说我们只需要做三步的工作即可:
1、实现模型类
2、为控制器和视图构建基架
3、选择数据库初始化策略
基架只是为应用程序的特定部分提供了起点,在此基础上可以根据自己的喜好做修改.