zoukankan      html  css  js  c++  java
  • Entity Framework 学习笔记(2)

    from:http://www.cnblogs.com/Richeir/p/5351632.html

    Entity Framework最主要的东西,就是自己创建的、继承于DbContext的类亚当

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /// <summary>
    /// Context相当于一个数据库
    /// </summary>
    public class MusicContext : DbContext
    {
        //base("LocalDB")表示要用到config文件中的名为“LcoalDB”的连接字符串
        public MusicContext() : base("LocalDB")
        {
        }
     
        //DbSet相当于数据表
        public DbSet<Album> Albums { get; set; }
    }

    当然,我们的数据表定义类也很简单,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /// <summary>
    /// 专辑
    /// </summary>
    public class Album
    {
        public int AlbumId { get; set; }
        public string Title { get; set; }
        public decimal Price { get; set; }
    }

    对应的实际数据表定义为:

    image

    可以很容易看到,int和decimal都很正常,string被翻译为nvarchar(MAX)天使

    很多时候我们并不需要让一个纯文本字段定义到nvarchar(MAX),大多数用的是一个实际的值,比如nvarchar(50)。

    想在Entity Framework中去这样实现,就得给字段加入特性(Attribute):

    需要添加两个命名空间:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /// <summary>
    /// 专辑(Table表示要为创建的数据表手动设置表名称)
    /// </summary>
    [Table(name: "MyTable")]
    public class Album
    {
        public int AlbumId { get; set; }
     
        /// <summary>
        /// StringLength可以设定最大长度
        /// </summary>
        [StringLength(50)]
        public string Title { get; set; }
     
        [Required]
        public decimal Price { get; set; }
    }

    这时如果我们运行程序,就会报错破碎的心

    image

    意思就是说:你程序中的表定义和数据库中的表定义不一致幽灵(肯定不一致啊,我们都改定义了)

    这个时候,我们就需要进行一组操作,将程序中的表定义,同步到数据库中去失望

    1. 打开Package Manager Console
      image
    2. 输入Enable-Migrations,开启数据库迁移
      image
      (如果项目中有多个DbContext对象,则这里会报错,相应的解决方法就是指定DbContext的类的包括命名空间的全名:Enable-Migrations –ContextTypeName 全名)
      (如果要让Entity Framework帮你自动将改动实施到目标数据库,则可以再添加一个选项 –EnableAutomaticMigrations,所以这个例子中比较好的写法就是:Enable-Migrations –ContextTypeName NormalTest.MusicContext –EnableAutomaticMigrations)
    3. 图中的内容表示已经创建数据库迁移组件,Entity Framework在项目中添加了一些文件,可以在Solution Explorer中看到
      image
    4. 这个时候呢,我们就可以继续输入指令Update-Database将目标数据库进行更新大笑(这里可以使用Update-Database –Scirpt选项来显示运行了哪些改动)。不过呢…又报错
      image
      意思是我们没有开启–EnableAutomaticMigrations这个选项。这里我们有两个方法来开启,一个是直接输入Enable-Migrations -EnableAutomaticMigrations -Force;另一个则是打开Entity Framework为我们刚刚创建好的Configuration.cs文件
      image
      把AutomaticMigrationsEnabled = false这个值改成true。
    5. 开启这个选项,我们再次输入Update-Database,还是报错破碎的心
      image
      这个错误是说,你将要进行的改动会对你目前的数据造成损失(把无限长的字符串把长度变为50肯定会造成损失),所以我们没有你的授权就不干!好吧,既然你没授权,我们就给你授权!
      授权的方式有两种,一个是使用Update-Database –Force来强行进行修改;另一个则是在刚才的Configuration.cs文件中再添加一句base.AutomaticMigrationDataLossAllowed = true;
      image
    6. 好了,让我们再执行一次Update-Database忍者
      image
      大功告成!
    7. 让我们打开数据库表定义看看
      image
      表名变成了MyTable,并且Title字段有了最长限定大笑大笑

    以上就是使用Entity Framework的Code First模式所进行的数据库更新,虽然繁琐,但是毕竟就是这么一个流程马上回来

    PS.如果我们在最后更新数据库的时候,输入Update-Database –Script,VS会自动打开一个SQL编辑窗口,里面有自动升成的更新脚本,当然这个时候脚本还没有执行呢!!还得手动执行一次!!外星人
    image

     
  • 相关阅读:
    Elasticsearch聚合 之 Date Histogram聚合
    Elasticsearch聚合 之 Terms
    Elasticsearch分析聚合
    mysql-聚合函数
    flask学习笔记(-操作数据库)
    在VS中调试javascript脚本
    jquery获取设置input值
    jquery后加Dom绑定事件
    Juicer——a fast template engine
    ASP.NET 一般处理程序
  • 原文地址:https://www.cnblogs.com/liuqiyun/p/8507542.html
Copyright © 2011-2022 走看看