zoukankan      html  css  js  c++  java
  • ASP.NET 使用MVC4的EF5 Code First 入门(一):创建数据库

    一、基本流程

    建立模型→建立控制器→EF框架自动生成视图的数据库

    二、基本理论

        1、约定优于配置(Convention Over Configuration)

    设计不好的框架通常需要多个配置文件,每一个都有许多设置。这些配置文件为每一个项目提供信息说明从URL到将类映射到数据库表的各种信息。大量包含太多参数的配置文件通常是过度复杂的应用设计的指标(代码坏味道)。本质是说,开发人员仅需规定应用中不符约定的部分。例如,如果模型中有个名为Sale的类,那么数据库中对应的表就会默认命名为sales。只有在偏离这一约定时,例如将该表命名为"products_sold",才需写有关这个名字的配置。

        2、EF Code First
    顾名思义,Code First就是代码优先,有了模型代码通过VS2013 MVC4 自带的EF框架就能够自动建库,建表,初始化数据,无需在设计器中去建库、建表,EF也遵循一定的约定,比如模型是Album,自动建表的表名也是Album,类中有ID属性,表中也自动建ID字段,并且是自动增量,EF还有关于外键的约定,EF框架对于一个从零开始的项目最合适不过了。

    三、基本步骤

         3.1、开发环境vs2013,新建MVC4,MusicStore项目

    image

         3.2、在Models文件夹下建立模型

    image 

        //1、专辑-模型(Album表)
        public class Album
        {
            public int AlbumId { get; set; }
    
            //类型Id
            public int GenreId { get; set; }
    
            //作者Id
            public int ArtistId { get; set; }
    
            //专辑名称
            public string Title { get; set; }
    
            //专辑价格
            public decimal Price { get; set; }
    
            //专辑图片
            public string AlbumArtUrl { get; set; }
    
            //类型对象
            public virtual Genre Genre { get; set; }
    
            //作者对象
            public virtual Artist Artist { get; set; }
        }
    
        //2、专辑类型-模型(Genre表)
        public class Genre
        {
            //Id
            public int GenreId { get; set; }
            
            //类型名称
            public string Name { get; set; }
            
            //类型描述
            public string Description { get; set; }
    
            //专辑列表
            public virtual List<Album> Albums { get; set; }
    
        }
    
        //3、作者-模型(Artist表)
        public class Artist
        {
            //Id
            public int ArtistId { get; set; }
    
            //姓名
            public string Name { get; set; }
        }

         3.3、在Models文件夹下建立数据库上下文类(数据库操作相关,EF框架据此建库建表)

         注意:需要引用EF和System.Data.Entity

    image 

       //数据库上下文,连接数据库
        public class MusicStoreDBContext:DbContext
        {
            public MusicStoreDBContext()
                : base("MusicStoreDBContext")
            { 
                
            }
    
            public DbSet<Album> Albums { get; set; }
            public DbSet<Artist> Artists { get; set; }
            public DbSet<Genre> Genres { get; set; }
        }

         3.4、在Models文件夹下建数据初始化类

          注意:这样在模型改变时就会自动再建表,初始化数据

       //数据初始化类
        public class MusicStoreDbInitializer : DropCreateDatabaseAlways<MusicStoreDBContext>
        {
            //需重写Seed方法
             protected override void Seed(MusicStoreDBContext context)
            {
                /*//如果这里不填写数据,默认建空表
                  //初始化实例添加默认数据
                  context.Artists.Add(new Artist { Name = "我是小小鸟" });
                context.Genres.Add(new Genre { Name = "Jazz" });
                context.Albums.Add(new Album
                {
                    Artist = new Artist { Name = "Rush" },
                    Genre = new Genre { Name = "Rock" },
                    Price = 9.99m,
                    Title = "Caravan"
    
                });
                */
                base.Seed(context);
            }
        }

         3.5、在Global.asax 文件中添加第四步(3.4)中新建的数据初始化类

         注意:在模型改变时会自动再建表,初始化数据

            protected void Application_Start()
            {
                //添加第四步中新建的数据库初始化类(在模型改变时会自动再建表,初始化数据)
                //其他不动,添加此处
                  Database.SetInitializer(new MusicStore.WebSite.Models.MusicStoreDbInitializer());
    
                AreaRegistration.RegisterAllAreas();
    
                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
            }

         3.6、在Controllers文件下建StoreManager控制器

          注意:所有的增、删、改、查代码和页面视图都是由EF框架自动生成的。

    image

    image

    image

    自动生成的模板如下图:

    image

         3.7、在Web.cifig文件添加数据库(sql Server)连接字符串。

    image

    四、运行程序,生成数据库(如下为对应的截图)

    image

    五、约定

    因为使用了约定,你用于编写建立一个完整数据库的代码量已经降低到了最少。这些约定已经在前面的教程中使用到,或许你没有意识到你正在使用它们,包括:

    • 实体类型的复数形式被用作表名
    • 实体属性名被用作列名
    • 被命名为ID或实体名+ID的属性被用作主键。
    • 当一个属性以<导航属性名><主键属性名>时被用作外键(例如,Student实体的主键是ID,则StudentID为导航属性的外键)。你也可以使用简单的<主键属性名>(例如,Enrollment实体的主键是EnrollmentID,你可以直接使用EnrollmentID)。

    你已经看到,约定可以被覆盖。例如指定表的名称不应当使用复数形式,你会看到以后如何明确标记属性作为外键属性。你将在后面的教程中了解更多有关约定及如何重写它们。

     

  • 相关阅读:
    Java技术学习笔记:C/S 与B/S 区别
    Java开发面试题总结(八)
    Java技术笔记:数据库的性能优化
    零基础学习Python可以学会吗?你有哪些方法?
    java培训学习路线图之SpringBoot多模块开发学习
    计算机专业选Java和Python哪个前景好点?
    bzoj2152 聪聪可可
    bzoj1468 Tree
    bzoj2879 [Noi2012]美食节
    bzoj2208 [Jsoi2010]连通数
  • 原文地址:https://www.cnblogs.com/pingming/p/5058493.html
Copyright © 2011-2022 走看看