EF自动创建数据库步骤之三(自定义数据库初始器)

        EF自动创建数据库需要我们告诉数据库如何进行初始化;如创建表后是否需要插入一些基础数据,是否 需要创建存储过程、触发器等。还有就是EF有三种初始化方式(参见下面三个类):

  1. DropCreateDatabaseIfModelChanges 模型一变重建数据库(开发阶段)     
  2. CreateDatabaseIfNotExists  数据库不存在时创建数据库(适合项目正式上线)
  3. 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;
        }
    }
}

 

posted @ 2019-07-29 09:51  Hi,Sky  阅读(686)  评论(0编辑  收藏  举报