EF自动创建数据库步骤之三(自定义数据库初始器)
EF自动创建数据库需要我们告诉数据库如何进行初始化;如创建表后是否需要插入一些基础数据,是否 需要创建存储过程、触发器等。还有就是EF有三种初始化方式(参见下面三个类):
- DropCreateDatabaseIfModelChanges 模型一变重建数据库(开发阶段)
- CreateDatabaseIfNotExists 数据库不存在时创建数据库(适合项目正式上线)
- DropCreateDatabaseAlways 每次启动程序时都重新创建数据库(提前是数据库不能被任何程序占用,包含sqlserver管理工具打开运行也会报错被使用,此方式不太可取,建议不要使用)
下面示例如何创建初始化器并插入一些数据、创建触发器(首次创建数据库才会执行Seed方法)
using System; using System.Collections.Generic; using System.Data.Entity; using System.IO; using System.Linq; using System.Reflection; using System.Text; namespace DBClientEntity { /// <summary> /// 数据库初始化器 /// </summary> public class DBIfNotExistsInitializer : CreateDatabaseIfNotExists<DbClientContext> public override void InitializeDatabase(DbClientContext context) { base.InitializeDatabase(context); } /// <summary> /// 初始化一些数据,模型有变化或首次运行才会执行 /// </summary> /// <param name="context"></param> protected override void Seed(DbClientContext context) { #region 创建触发器(不处理异常) //[UserInfo]表触发器 string fileName = "trUserInfo.Trigger.sql"; string sql = GetSqlFile(fileName); if (!string.IsNullOrEmpty(sql)) { try { context.Database.ExecuteSqlCommand(sql); } catch (Exception ex) { throw new Exception(string.Format("执行脚本{0}出错! {1}", fileName, ex.Message)); } } #endregion //创建内置帐号 User item = new User(); item.ID = "admin"; item.Password = "111111"; item.Type = 2; item.CreateTime = DateTime.Now; if (context.User.Count(x => x.ID == item.ID) < 1) { context.User.Add(item); context.SaveChanges(); } base.Seed(context); } /// <summary> /// 读取资源文件中的脚本文件 /// </summary> /// <param name="fileName">如UserInfo.Trigger.sql</param> /// <returns></returns> private string GetSqlFile(string fileName) { string sql = ""; string nameSpace = this.GetType().Namespace; Assembly assembly = Assembly.GetExecutingAssembly(); Stream stream = assembly.GetManifestResourceStream(nameSpace + "." + fileName); if (stream != null) { try { //默认编码加载脚本文件 using (StreamReader reader = new StreamReader(stream, Encoding.Default)) { sql = reader.ReadToEnd(); } } catch { } finally { stream.Close(); } // 返回读取结果 } return sql; } } }