zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
  • 相关阅读:
    关于网页编码转换的几种方法
    java加载静态properties的方法
    js 点击 li 获取 设定的参数信息
    添加网关信息
    SQL 函数
    SQL Date函数
    SQL 视图(VIEW)
    SQL高级语法3
    SQL 约束
    SQL 创建表
  • 原文地址:https://www.cnblogs.com/FGang/p/11262225.html
Copyright © 2011-2022 走看看