code first

1.先安装EntityFramework,项目-管理NuGet程序包-联机-搜索“EntityFramework”,下载安装。

安装完成后会在项目下自动添加EntityFramework引用:

2.新建几个类

//EF默认是启动延迟加载的,我们如果不需要也可以手动禁止:
    //db.Configuration.LazyLoadingEnabled = false;
    public class New
    {
        [Key]
        public int NewId { get; set; }

        [MaxLength(50)]
        public string Title { get; set; }

        public int NewTypeId { get; set; }

        public virtual NewType NewType { get; set; }
    }

public class NewType
    {
        public int NewTypeId { get; set; }

        [MaxLength(30)]
        public string Name { get; set; }

        public int BlogId { get; set; }

        public virtual List<New> New { get; set; }
    }
View Code

NewId和NewTypeId在创建的时候会做为表的主键,因为包含有ID关键字,如果不包含的话,需要我们指定主键,要不然创建就会报未找到主键的错误,添加命名空间:
using System.ComponentModel.DataAnnotations;

并在属性前添加[Key]标注,指示此字段作为主键

需要注意的另外一点,上面定义模型属性的时候有virtual关键字,表示延迟加载,我的理解是这样:当我访问主实体的时候,启动延迟加载,而不会查询数据库的子实体,只有要访问它的时候才会去数据库查询加载,泛型List表示此实体是一对多的关系。

EF默认是启动延迟加载的,我们如果不需要也可以手动禁止:db.Configuration.LazyLoadingEnabled = false;,

3.创建上下文DbContext

public class NewDbContext : DbContext
    {
        static NewDbContext()
        {
            //Database.SetInitializer<NewDbContext>(null);
            //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<NewDbContext>())
        }
        public DbSet<New> News { get; set; }
        public DbSet<NewType> NewTypes { get; set; }
    }
View Code

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<NewDbContext>()); 重新创建数据库?

console:控制台

static void Main(string[] args)
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<NewDbContext>());
            InsertDestination();
        }

        private static void InsertDestination()
        {
            using (var db = new NewDbContext())
            {
                var type_Model = new NewType { Name = "测试01" };
                db.NewTypes.Add(type_Model);
                db.SaveChanges();
            }
        }
View Code

4.配置连接字符串

<connectionStrings>
    <!--<add name="NewDbContext" providerName="System.Data.SqlClient" connectionString="Data source=..;Initial Catalog=NewDbContext;User ID=sa;Password = qwe_123;Trusted_Connection=true" />-->
    <add name="NewDbContext" providerName="System.Data.SqlClient" connectionString="Data Source=.;Database=NewDbContext;Trusted_Connection=true;User ID=sa;Password = qwe_123;" />
  </connectionStrings>
View Code

需要注意的是:连接字符串的名称必须要和上下文一致,而且connectionStrings必须放在configuration节点内的最下面,如果放在最上面会报下面这种错误:

5.数据迁移

例如我们上面创建NewTypes表的时候,没有指定字段的长度,默认是创建字段类型是nvarchar(MAX),有时候我们觉得字段长度太长,需要修改一下字段长度,不要直接去修改数据库,而是在模型中修改:

[MaxLength(50)]
public string Name { get; set; }

MaxLength就是上面我们说到DataAnnotations命名空间下的类型,这边我们注意下,我们在生成数据库的时候添加了一条数据

1.PM> Install-Package EntityFramework -Version 5.0.0.0 //EF版本
2.PM> Enable-Migrations
在程序包管理器控制台输入“Enable-Migrations”命令来启用迁移,运行完成后在项目中会创建一个Migrations文件夹,下来有两类文件
  • Configuration.cs — 此文件包含“迁移”将用来迁移 BloggingContext 的设置。在本演练中不需要进行任何更改,但是,在此处可以指定种子数据、为其他数据库注册提供程序、更改生成迁移的命名空间等。
  • <时间戳>_InitialCreate.cs — 这是第一个迁移,它表示已经应用于数据库的更改。应用更改的目的是将其从空数据库迁移至包含博客和文章表的数据库。尽管我们让 Code First 自动创建这些表,现在我们选择“迁移”(已转化为一次“迁移”)。Code First 还在本地数据库中记录:该“迁移”已经应用。文件名中的时间戳用于排序。

  需要注意的是:在我们生成数据库的时候,除了New和NewType表外,还有一个系统生成表__MigrationHistory,从表名上就可以看出是迁移历史记录表。

  3,在程序包管理器控制台输入“Add-Migration Update-NewType-Name”命令,Add-Migration表示增加一个迁移,后面是迁移名称,这个我们可以随便写,运行后会自动检测模型和数据库发生的变化,在Migrations文件夹下会生成一个“201403290930423_Update-NewType-Name.cs”文件,打开我们可以看到更新内容

从上面可以看出就是我们上面修改模型的内容,当然你也可以在这上面直接修改,比如你再加一个更新,可以一起提交到数据库。

  4,在程序包管理器控制台输入“Update-Database”命令,表示将所有的迁移应用到数据库,打开数据库,我们看一下效果:

  从上面可以看出,字段Name的类型已经修改为nvarchar(50),而且字段值并没有发生变化,可以证明,Code First迁移并不是删除数据库再创建。

  Code First迁移除了上面说的字段类型修改还有很多内容,比如添加字段,删除字段,删除表等等,但都是大同小异,可以举一反三。

转:http://www.cnblogs.com/xishuai/p/3632304.html#xishuai_h4
http://www.cnblogs.com/qouoww/archive/2011/12/31/2309122.html
原文地址:https://www.cnblogs.com/love201314/p/5834216.html