code first 创建和初始化数据库

1.前言 

 Code First是Entity Framework提供的一种新的编程模型。通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码对象来生成数据库。当然我们在实际开发过程当中要做单元测试。进而每次测试的时候 要对库进行初始化,这样就不会因上次测试而对本次测试有所影响。下面是具体的实现。

2.建立对象

2.1建立对象

    /// <summary>
    /// model对象
    /// </summary>
    public class model_item : supermodel
    {
        public model_item()
        {
            type = ItemType.Normal;//枚举类型初始化
        }

        [Required]
        [StringLength(16, MinimumLength = 2)]
        public string name { get; set; }
        [Required]
        [StringLength(16, MinimumLength = 2)]
        public string code { get; set; }
        public ItemType type { get; set; }
        public bool State { get; set; }
        public string Icon { get; set; }
        public long sort { get; set; }
        public long appid { get; set; }
    }

2.2.DBContext

public class GDG_DbContext : DbContext
    {
        public GDG_DbContext() : base("GDG_DbContext") { }
        public DbSet<model_item> model_item { get; set; }
       protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
         
        }
    }

2.3为对象赋默认值【可选择】

public class DataInit : IDataInitializer<GDG_DbContext>
    {

    public void Initialize(GDG_DbContext context)
          {
              List<model_item> fim = new List<model_item>() { 
                new model_item(){name="郭德纲",code="gdg",type= ItemType.Normal,State=true,Icon="taoxin.png",sort=0,appid=0,reg_time=DateTime.Now},
                new model_item(){name="于谦",code="yq",type= ItemType.Normal,State=true,Icon="juanmao.png",sort=1,appid=1,reg_time=DateTime.Now},
                new model_item(){name="德云社",code="dys",type= ItemType.Normal,State=true,Icon="yun.png",sort=2,appid=2,reg_time=DateTime.Now},
           };
           fim.ForEach(o => context.model_item.Add(o));
           context.SaveChanges();
        }
}

3.EF Code First

3.1新增

public bool Build()
        {
            try
            {
                var context = new FeeDbContext();
                if (!context.Database.Exists())
                {
                    new List<IDataInitializer<GDG_DbContext>>() { 
                        new DataInit()
                    }.Setup<GDG_DbContext>(context);
                    return true;
                }
                return false;
            }
            catch (DbEntityValidationException ex)
            {
                StringBuilder error = new StringBuilder();
                foreach (var item in ex.EntityValidationErrors)
                {
                    foreach (var item2 in item.ValidationErrors)
                    {
                        error.Append(string.Format("{0}:{1}\r\n", item2.PropertyName, item2.ErrorMessage));
                    }
                }
                Console.WriteLine("数据库初始化报错:" + error);
                throw ex;
            }
            catch (Exception e)
            {
                Console.WriteLine("数据库初始化报错:" + e.Message);
                throw e;
            }
        }

3.2移除

public bool Remove()
        {
            var context = new GDG_DbContext();
            try
            {
                if (context.Database.Exists())
                {
                    return context.Database.Delete();
                }
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine("数据库初始化报错:" + e.Message);
                return false;
            }
            finally { context.Dispose(); }
        }

3.3初始化

public bool Rebuild()
        {
            return Remove() && Build();
        }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏快乐八哥

委托(一个主窗体统计多个从窗体的按钮单击的次数)

  最近在学习金老师的《.NET2.0面向对象编程揭秘》,学到了13章,委托、事件驱动和异步调用。书上有个试一试,要求:利用委托,达到一个主窗体统计多个从窗体...

1818
来自专栏大内老A

ASP.NET MVC Controller激活系统详解:总体设计

我们将整个ASP.NET MVC框架划分为若干个子系统,那么针对请求上下文激活目标Controller对象的子系统被我们成为Controller激活系统。在正式...

1956
来自专栏Golang语言社区

golang的一个分页方法

需要做一分页。。就做了个方法,beego里的例子太麻烦了。还是弄个简单的吧,上代码。。 //分页方法,根据传递过来的页数,每页数,总数,返回分页的内容 7个页...

28110
来自专栏流浪猫的golang

golang slice 与list 的性能分析。

本机运行结果: 声明:测试结果为个人电脑的测试结果,仅供参考。 slice 创建速度:1.3029245s list 创建速度: 9.7489181...

551
来自专栏跟着阿笨一起玩NET

winform TreeView树节点上下移动

521
来自专栏木宛城主

工欲善其事,必先利其器:分享一套Code Smith 搭建N层架构模板

 开篇 平常开发时,由于冗余代码过多,程序员做重复的工作过多势必会影响开发效率。倘若对重复性代码简单的复制、粘贴,虽然也能节省时间,但也需仔细一步步替换,这无...

1738
来自专栏大内老A

深入探讨ASP.NET MVC的筛选器

在ActionInvoker对Action的执行过程中,除了通过利用ActionDescriptor对Action方法的执行,以及之前进行的Model绑定与验证...

1668
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录

我们之前做了验证码,登录界面,却没有登录实际的代码,我们这次先把用户登录先完成了,要不权限是讲不下去了 把我们之前的表更新到EF中去 ? 登录在Account控...

15710
来自专栏菩提树下的杨过

java调用.net asmx / wcf

一、先用asmx与wcf写二个.net web service: 1.1 asmx web服务:asmx-service.asmx.cs 1 using Sy...

2055
来自专栏Golang语言社区

golang的一个分页方法

需要做一分页。。就做了个方法,beego里的例子太麻烦了。还是弄个简单的吧,上代码。。 //分页方法,根据传递过来的页数,每页数,总数,返回分页的内容 7个页...

3947

扫码关注云+社区