小白学习做项目(2)_使用EntityFramework实现Code First设计数据库(2)

欢迎大家再次光临寒舍~

昨天,我们已经很成功的将我们的User类成功的映射到了数据库中。*★,°*:.☆\( ̄▽ ̄)/$:*.°★*

但是在数据库中我们也看到了,数据库中所有的列都是已默认类别映射过来的,今天我们就要修改这些属列的映射规则。

Code First有两种配置数据库映射的方式,一种是使用数据属性DataAnnotation,另一种是Fluent API.

DataAnnotation的配置方式需要你给定义实体和值对象的类和类中的属性加上与数据库映射相关的配置标签。

比如我们的User类,按照Code First的默认规则,表明应该叫User,但是我们想把表的名称设为UserInfo,那么我们如何通过DataAnnotation让Code First根据我们的要求配置数据表的名字呢?

简单的一塌糊涂:

 [System.ComponentModel.DataAnnotations.Schema.Table("UserInfo")]
    public class User
    {
        public int UserID { get; set; }
        public string Nick { get; set; }
        public string Address { get; set; }
        public string LoginName { get; set; }
        public string Password { get; set; }
        public string PhoneNumber { get; set; }
        public string Email { get; set; }
    }

User

另外一种配置的方式是使用Fluent API,Code First Fluent API 是在DbContext中定义数据库配置的一种方式。要使用Fluent API 就必须在你自定义的继承自DbContext的类中重载OnModelCreating这个方法。通过modelBuilder这个对象的Entity<>泛型方法来配置你的DbContext中的每个类的数据库映射。示例代码如下:

    public class BlogContext : DbContext
    {
        public BlogContext()
            : base("name=Blog")
        { }

        public DbSet<User> Users { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

            modelBuilder.Entity<User>().ToTable("UserInfo");

        }
    }

BlogContext

那么在实际项目中,我们采用哪种配置方式由大家自由选择吧,本文采用刘兄建议的要介绍的是Fluent API的设置方式。(其实我是在学习中(-__-)b)

modelBuilder的Entity<User>方法的返回值是EntityTypeConfiguration<User>类,可以通过它的Property方法,并且通过lamda表达式设置数据表中指定列的属性。

    public class BlogContext : DbContext
    {
        public BlogContext()
            : base("name=Blog")
        { }

        public DbSet<User> Users { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().Property(s => s.Password).IsRequired().HasMaxLength(128);
            modelBuilder.Entity<User>().Property(s => s.LoginName).IsRequired().HasMaxLength(20);
            modelBuilder.Entity<User>().Property(s => s.PhoneNumber).HasMaxLength(20);
            modelBuilder.Entity<User>().Property(s => s.Email).HasMaxLength(128);

        }
    }

BlogContext

但是对于我们这个用户类来说,除了UserID以外,我们还要对LoginName,PhoneNumber,Email做唯一性限制。(这个和我想的不一样啊)。

在这之前,我们首先将我们目前修改好的列映射到数据库中。

不知道大家运行测试的时候出没出错。其实,通过昨天的项目,我们数据库中已经有了数据库XYY.Blog,并且这次提交的User表中列的限定又和原有的不一致,所以就会报错。

其实,我们只有在开发阶段,才会有修改数据库中表的列属性这个操作,我们可以通过Code First提供的Database类的SetInitializer方法设定Code First如何根据Fluent API数据库映射配置初始化数据库。

SetInitializer方法的参数可以使以下三个泛型类的对象:

CreateDatabaseIfNotExists<>:只有在没有数据库的时候才会根据数据库连接配置创建新的数据库。这种配置主要用于production环境,因为你不可能把你现在使用的数据库删除掉,那样会损失重要的数据。你需要让你的实施人员拿着与Fluent API配置对应的数据库脚本去更新数据库。

DropCreateDatabaseIfModelChanges<>:只要Fluent API配置的数据库映射发生变化或者程序的模型l发生变化了,就把以前的数据库删除掉,根据新的配置重新建立数据库。这种方式比较适合开发阶段,可以减少开发人员的工作量。

DropCreateDatabaseAlways<>:不管数据库映射或者model是否发生变化,每次都重新删除并根据配置重建数据库。这种方式可以适用于一些特殊情况的测试,比如说当每次测试结束之后把所有的测试数据都删除掉,并且在测试开始前插入一些基础数据。

那么,在开发阶段,我们要根据需求来进行变动我们的数据库,所以在此我们使用DropCreateDatabaseAlways<>这个泛型类。

其实,我们可以直接在测试类、控制台等入口直接使用

Database.SetInitializer(new DropCreateDatabaseAlways<BlogContext>());

同时设置,dbContent.Database.Initialize(true);即可

但不建议这么用,最好的使用方法如下

    public class DropCreateOrderDatabaseWithSeedValueAlways : DropCreateDatabaseAlways<BlogContext>
    {

    }

SeedValueAlways

内部实现,先空下,暂时不影响我们程序的进行,后面会再次使用到这个自定义的类。

我们测试一下,实际测试类代码如下:

    [TestClass]
    public class Test
    {
        [TestMethod]
        public void MyTest()
        {

            System.Data.Entity.Database.SetInitializer(new DropCreateOrderDatabaseWithSeedValueAlways());
            BlogContext dbContent = new BlogContext();
            dbContent.Database.Initialize(true);
            var blogContext = new BlogContext();
            //var blogContext = new aContext();
            //var user = new User() { UserID = 1, LoginName = "888888", Password = "53523113" };
            //blogContext.Users.Add(user);
            var rr = blogContext.SaveChanges();
            //new BlogContext().SaveChanges()
        }
    }

Test

运行成功后我们对比一下:

可以明显看到,我们的设置有效果了。

本来想把如何设置唯一约束放在这里的,不过中间的实现和我设想的不一样,就没办法了,这一节就到这里吧,明天我们主要讲解一下唯一约束和初始化数据的知识。

时间: 2024-10-27 17:59:07

小白学习做项目(2)_使用EntityFramework实现Code First设计数据库(2)的相关文章

做项目的感受和心得

首先,我要肯定老师的教学方法,让我们把书本上比较无趣的知识应用在了做项目上面.几周下来,老师一边讲课一边给我们讲实际项目所需要的各种知识,这不仅让我对软件工程有了一个大概的认识,还让我学习了项目中会用到的东西. 其次,在不短不长的7周左右的时间里,我们完成了教学辅助系统的项目,虽然还存在一些小问题,我们的团队也还在进行最后的测试和修正.但我真正感受到了大家学习的热情,也体会到了团队做项目的各种考验,但我们做到了,也许不是很好,但我还是很开心.在这7周左右的时间里,我经历了从html+css走到p

Asp.Net Identity学习笔记+MVC5默认项目解析_授权&Claim

Identity学习笔记 Asp.Net Identity学习笔记+MVC5默认项目解析_基础用法 Asp.Net Identity学习笔记+MVC5默认项目解析_授权&Claim Identity学习笔记授权以角色授权IdentityRoleRoleManager基于声明的(Claims)IPrincipalIIdentityCalimsIdentityClaim用户登入用户授权其他细节Claim Type命名空间 授权 最常用的授权就是给Controller或Action打上[Authori

Asp.Net Identity学习笔记+MVC5默认项目解析_第三方登入&授权总结

Identity学习笔记 Asp.Net Identity学习笔记+MVC5默认项目解析_基础用法 Asp.Net Identity学习笔记+MVC5默认项目解析_授权&Claim Asp.Net Identity学习笔记+MVC5默认项目解析_第三方登入&授权总结 Identity学习笔记第三方登入配置登入案例登入技术总结本地,已登入本地,未登入第三方登入 第三方登入 本文介绍Identity的第三方登入技术.到目前为止只介绍了CookieAuthentication这种授权方式,即浏览

如何学习JavaEE,项目又该如何做?

01 java基础学习 建议初学者看视频学习,不推荐看书.入门视频选择非常重要,最好是通俗易懂.深入浅出的教学视频.如果入门视频选的不好,不知所云,容易产生厌倦心理:“从入门到放弃”.关于java书籍,前期的学习个人不推荐直接看书:书本较为枯燥.不直观.容易分心.可能坚持不下来. 02 javaEE入门学习 上面的基础部分的学习主要是为后阶段打好基础.javaEE是java开发学习路上举足轻重的一员,那么javaEE该如何学习呢?框架那么多,该学哪些呢?从哪个框架开始学习呢?从博主以及身边同学的

适合新手小白学习的web前端自学路线图整理

新手小白学习web前端要学多久?没有基础的同学想要学习web前端选择什么样的学习方式会比较好一些呢?很多想要学习web前端开发的同学都有这个困惑,主要是担心web前端开发门槛高,害怕学不会. 其实关于零基础怎样学习web前端开发这个问题我们应该辩证的来看待,相对于IT技术类的其他技术岗位,web前端开发绝对算是门槛较低的,当然对应的起点也是比较低的.如果有小白有意向入行或者转行的话建议选择web前端.web前端开发门槛低主要体现在两个方面: 第一:web前端开发入门门槛低体现在html和CSS上

用深度学习做命名实体识别(四)——模型训练

通过本文你将了解如何训练一个人名.地址.组织.公司.产品.时间,共6个实体的命名实体识别模型. 准备训练样本 下面的链接中提供了已经用brat标注好的数据文件以及brat的配置文件,因为标注内容较多放到brat里加载会比较慢,所以拆分成了10份,每份包括3000多条样本数据,将这10份文件和相应的配置文件放到brat目录/data/project路径下,然后就可以从浏览器访问文件内容以及相应的标注情况了. 链接:https://pan.baidu.com/s/1-wjQnvCSrbhor9x3G

电脑小白学习软件开发-C#语言基础之循环重点讲解,习题

写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 本教程是基础教程,适合任何有志于学习软件开发的人.当然因为技术的连贯性,推荐按照顺序查看. 上次课程:电脑小白自学软件编程-.Net语法基础之循环语句,纯技巧干货 近期,致力于进行C#语言教程的写作.写一系列可以供电脑小白学习软件开发的文章,帮助更多初学者入门学习IT编程. 课程总目录:因头条无法自定义目录,大家关注:“做全栈攻城狮”微信公众号

javascript小白学习指南0---1

引言: 做为一名程序员,都是真心的想把自己的东西分享出来,供大家一起学习探讨,一起提高技能,一起涨工资,呵 这一系列的文章都是关于Javascript 基础的 当然文章当中穿插了些我自己的理解,希望可以帮助一些刚开始的童鞋! 废话不多说我们开始吧! 第一章:Javascript 基本概念 主要内容 数据类型 控制语句 函数 我们先从最简单的数据类型开始吧! 首先请记住javascript 有5种基本数据类型和1种复杂数据类型,至于为什么只有这六种,大家可以去翻翻W3C的资料哈! 五种基本数据类型

【无私分享:ASP.NET CORE 项目实战(第三章)】EntityFramework下领域驱动设计的应用

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在我们 [无私分享:从入门到精通ASP.NET MVC] 系列中,我们其实也是有DDD思想的,但是没有完全的去实现,因为并不是所有的好的东西都必须要用到的,还是根据实际情况,DDD在大型的系统中是非常好的一种设计思想,这点不否认.但是根据具体情况而言,在我们小型的项目中,我们设计框架的更多考虑的是让使用者快速.便捷的开发,能快速的了解框架进行项目开发. 重构我们的思路 最近研究了一下几位大神的博客,特别是:@腾飞(Jess