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;
            }
        }
    }
  • 相关阅读:
    Vue(小案例_vue+axios仿手机app)_go实现退回上一个路由
    nyoj 635 Oh, my goddess
    nyoj 587 blockhouses
    nyoj 483 Nightmare
    nyoj 592 spiral grid
    nyoj 927 The partial sum problem
    nyoj 523 亡命逃窜
    nyoj 929 密码宝盒
    nyoj 999 师傅又被妖怪抓走了
    nyoj 293 Sticks
  • 原文地址:https://www.cnblogs.com/FGang/p/11262225.html
Copyright © 2011-2022 走看看