zoukankan      html  css  js  c++  java
  • MVC之CodeFirst

    1.建立MVC项目》NuGet安装EF

    2.建立模型:

    public class Blog
        {
            [Key]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public Guid Id { get; set; }
            public string Title { get; set; }
            public string Author { get; set; }
            public DateTime Time { get; set; }
            public string Summary { get; set; }
            public string Content { get; set; }
            public virtual ICollection<Comment> Comments { get; set; } = new List<Comment>();
        }
    
     public class Comment
        {
            [Key]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public Guid Id { get; set; }
            public string VisitorName { get; set; }
            public string Email { get; set; }
            public DateTime Time { get; set; }
            public string Content { get; set; }
    
            [ForeignKey("Blog")]
            public Guid BlogId { get; set; }
            public virtual Blog Blog { get; set; }
        }

    模型需要引用命名空间:

    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;

    3.建立数据库类 DbContext:

    public class EFDbContext : DbContext
        {
            public DbSet<Product> Products { get; set; }
            public DbSet<Blog> Blogs { get; set; }
            public DbSet<Comment> Comments { get; set; }
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();  //去除“设置表名为复数”这条约定
            }
        }

    DbContext需要引用命名空间:

    using System.Data.Entity;
    using System.Data.Entity.ModelConfiguration.Conventions;

    4.配置web.config数据库连接,连接名称需要是EFDbContext,和建立的DbContext名称一致;或者在EFDbContext中使用构造函数指定连接名称:

    public EFDbContext() : base("数据库链接的结点名字") { }

    <add name="EFDbContext" connectionString="Data Source=.;Initial Catalog=db_codefirst_test;Persist Security Info=True;User ID=sa;Password=123456;" providerName="System.Data.SqlClient" />

    记得加上:providerName="System.Data.SqlClient"

    5.新建一个测试Controller,选择具有增删改查的模板,然后选择对应的模型类、数据库上下文类。

    6.运行程序,浏览刚才建的Controller的View,数据库就自动建好了。

    7.要是修改模型类,数据库中的表需要删了重建。

    8.可自动根据模型变化重新建库,并插入初始化数据,选择不同模式即可。

    DropCreateDatabaseIfModelChanges:当模型改变时,重新建库;

    DropCreateDatabaseAlways:每次启动程序时,重新建库;

    Seed方法用来插入数据。

    /// <summary>
        /// 数据库初始化
        /// </summary>
        public class BaseInitializer : DropCreateDatabaseIfModelChanges<EFDbContext>
        {
            //CreateDatabaseIfNotExists:数据库不存在时重新创建数据库
            //DropCreateDatabaseIfModelChanges:当模型改变时,重新建库;
            //DropCreateDatabaseAlways:每次启动程序时,重新建库;
            protected override void Seed(EFDbContext context)
            {
                var blogs = new List<Models.Blog>
                {
                    new Models.Blog{ Author="小明", Content="老师:小明,你给我滚出去!", Time=DateTime.Now, Title="小明日常", Comments=new List<Models.Comment>(){
                        new Comment(){ Content = "test", Email="908085411@qq.com", Time=DateTime.Now, VisitorName="jay.x" }
                    } },
                    new Models.Blog{ Author="小红", Content="老师:小红,你去看看小明去哪儿了!",  Time=DateTime.Now, Title="小红日常"},
                    new Models.Blog{ Author="小蓝", Content="小蓝:老师,小明和小红在玩游戏!",  Time=DateTime.Now, Title="小蓝日常"},
                    new Models.Blog{ Author="小白", Content="小白:我去看看!",  Time=DateTime.Now, Title="小白日常"},
                    new Models.Blog{ Author="小黄", Content="小黄:我也去看看!",  Time=DateTime.Now, Title="小黄日常"}
                };
    
                blogs.ForEach(s => context.Blogs.Add(s));
                context.SaveChanges();
    
                var cou = new List<Models.Product>
                {
                    new Models.Product{ Name="西瓜", Price=decimal.Parse("3.5")},
                    new Models.Product{ Name="油桃", Price=decimal.Parse("8")},
                };
    
                cou.ForEach(c => context.Products.Add(c));
                context.SaveChanges();
            }
        }
    BaseInitializer

    在Global中注册这个初始化类:

    protected void Application_Start()
            {
                .........
    
                //添加建表  
                Database.SetInitializer<EFDbContext>(new BaseInitializer());
            }

    //添加自动化建表,一般情况第一次运行需要这么写
    //当修改了Model,又不想删除重建的时候,把SetInitializer的参数设null。
    //原因是:删除重建会把测试数据也清除了
    //Database.SetInitializer<EFDbContext>(null);
    Database.SetInitializer<EFDbContext>(new BaseInitializer());
    误删表,如何恢复:http://www.cnblogs.com/bleychen/p/4350913.html

    EF通用数据层封装类:https://www.cnblogs.com/qtqq/p/6942312.html

  • 相关阅读:
    vue中打印 使用mapState映射 vuex state 中的数据 结果显示 [__ob__: Observer]的问题
    css里面鼠标的形状-----》easyui哪点事
    多张表进行关联查询---->删除某个数据的时候出现还有子记录的提示
    MyEclipse迁移过程中Tomcat版本不一致的解决办法
    Easyui里面动态设置输入框的可见性
    PL/SQL那点事-->修改Oracle数据库里面的字段长度
    PL/SQL那点事-->SqlSession operation; SQL []; ORA-01722: 无效数字
    PL/SQL数据开发那点事
    PL/SQL数据库开发那点事
    java类型与jdbc类型对应表
  • 原文地址:https://www.cnblogs.com/xsj1989/p/8072494.html
Copyright © 2011-2022 走看看