Entity Framework 6.1-Code First

原文:Entity Framework 6.1-Code First

Code First-代码优先,先创建好领域模型。新建MyDbContext继承DbContext。根据代码自动生成数据库

Code First优点

1.可以自由的创建领域模型,基本不受EF框架的限制。自由的命名。程序员只需要关心对象间的关系。基本做到了与数据库的完全分离。

2.便于单元测试。不再使用绑定性较强的edmx文件。只使用普通的Model类

3.使用Fluent API映射可以自由的定义表名、字段名和关系。可控性强

4.可以方便的进行数据库迁移

用法

一、创建领域模型:新建Contact、CGroup、Address三个Model类

public class Contact
  {
        public int ID { get; set; }
        public string Name { get; set; }
        public System.DateTime CreateDate { get; set; }
        public virtual Address Address { get; set; }
        public int CGroupID { get; set; }
        public CGroup CGroup { get; set; }
        public virtual ICollection<Book> Books { get; set; }
    }

    public class CGroup
    {
        public int Id { get; set; }
        public string GName { get; set; }
        public ICollection<Contact> Contacts { get; set; }
    }
    public class Address
    {
        public int ID { get; set; }
        public string Contury { get; set; }
        public string City { get; set; }
        public string Street { get; set; }
        public string Code { get; set; }
        public Contact Contact { get; set; }
    }

二、新建一个EFTestContext,继承自DbContext

 public class EFTestContext : DbContext
  {
        public EFTestContext() : base("name=CommunicationContext2") { }

        public DbSet<EFModels.CGroup> CGroups { get; set; }
        public DbSet<EFModels.Address> Addresses { get; set; }
        public DbSet<EFModels.Contact> Contacts { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<EasyUIEFWebApp.DAL.EFModels.Contact>().HasOptional(c => c.Address)
                .WithOptionalDependent(add => add.Contact);
            modelBuilder.Entity<EasyUIEFWebApp.DAL.EFModels.CGroup>().HasMany(c => c.Contacts)
                .WithRequired(c => c.CGroup).WillCascadeOnDelete(false);
            //modelBuilder.Entity<EasyUIEFWebApp.DAL.EFModels.Contact>().HasOptional(c => c.CGroup)
            //    .WithMany(c => c.Contacts).WillCascadeOnDelete(true);
        }
   }

注意:base("name=CommunicationContext2") { },这句表示使用Config文件里名为CommunicationContext2的数据库连接,如果直接写base("CommunicationContext2")
{ }

EF会自动创建一个名为CommunicationContext2的dbf文件。数据库名也是CommunicationContext2

三、Code First三种数据库创建模式

1.DropCreateDatabaseAlways

表示每次都重新创建数据库。适用于较小的项目前期开发。数据库和模型经常变动。使用的几率较小。使用方法:在程序启动方法中添加

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

2.DropCreateDatabaseIfModelChanges

表示每次模型改变时都重新创建数据库。项目前期开发,数据库和模型变动比较多。使用方法:在程序启动方法中添加

Database.SetInitializer(new
DropCreateDatabaseIfModelChanges<EFTestContext>());

3.MigrateDatabaseToLatestVersion

使用迁移数据库的最新版本。需要配合数据库迁移使用。

 数据库迁移(Migrations)

1.工具-》库程序包管理-》程序包管理器控制台,打开程序包管理器控制台。

输入Enable-Migrations,回车执行

会在项目中创建Migrations文件夹。Migrations文件夹下自动创建一个Configuration类,继承DbMigrationsConfiguration<EasyUIEFWebApp.DAL.EFTestContext>

internal
sealed class Configuration : DbMigrationsConfiguration<EasyUIEFWebApp.DAL.EFTestContext>
 {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(EasyUIEFWebApp.DAL.EFTestContext context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            // 在运行update-database时执行
            context.Addresses.AddOrUpdate(new EasyUIEFWebApp.DAL.EFModels.Address
            {
                Contury = "Amerca",
                City = "New York",
                Street = "Man Hand",
                Code = "560012",
                GateCode = "A 10"
            });
        }
    }

2.再运行Add-Migrations InitialCreate  命令。会Migrations在新建一个名为[DateStamp]_InitialCreate
的类,把现有的Model类生成数据库代码。如下

public partial class InitialCreate : DbMigration
  {
        public override void Up()
        {
            CreateTable(
                "dbo.Addresses",
                c => new
                    {
                        ID = c.Int(nullable: false, identity: true),
                        Contury = c.String(),
                        City = c.String(),
                        Street = c.String(),
                        Code = c.String(),
                        GateCode = c.String(),
                    })
                .PrimaryKey(t => t.ID);
            
            CreateTable(
                "dbo.Contacts",
                c => new
                    {
                        ID = c.Int(nullable: false, identity: true),
                        Name = c.String(),
                        CreateDate = c.DateTime(nullable: false),
                        CGroupID = c.Int(nullable: false),
                        Phone = c.String(),
                        Mobile = c.String(),
                        Address_ID = c.Int(),
                    })
                .PrimaryKey(t => t.ID)
                .ForeignKey("dbo.Addresses", t => t.Address_ID)
                .ForeignKey("dbo.CGroups", t => t.CGroupID)
                .Index(t => t.CGroupID)
                .Index(t => t.Address_ID);
            
            CreateTable(
                "dbo.CGroups",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        GName = c.String(),
                        GAuthor = c.String(),
                    })
                .PrimaryKey(t => t.Id);
            
        }
        
        public override void Down()
        {
            DropForeignKey("dbo.Contacts", "CGroupID", "dbo.CGroups");
            DropForeignKey("dbo.Contacts", "Address_ID", "dbo.Addresses");
            DropIndex("dbo.Contacts", new[] { "Address_ID" });
            DropIndex("dbo.Contacts", new[] { "CGroupID" });
            DropTable("dbo.CGroups");
            DropTable("dbo.Contacts");
            DropTable("dbo.Addresses");
        }
 }

3.再运行Update-Database,生成数据库

4.模型有改动是运行Add-Migrations
-Force InitialCreate命令,生成数据库的变更代码。命名为[DateStamp]_InitialCreate1

5。再次运行运行Update-Database,更新数据库。也可以在程序运行时运行

Database.SetInitializer(new
MigrateDatabaseToLatestVersion<EFTestContext,Configuration>());代码,每次都会检查挂起的模型更改,迁移成最新的数据库。

6.可以单独生成sql,而不直接运行。运行Update-Database
-Script –SourceMigration:开始的数据库版本 –TargetMigration:结束的数据库版本(可省略,表示到最新的)命令


四、测试

跟DBFrist、model
first使用方法一样

时间: 2024-09-17 03:59:54

Entity Framework 6.1-Code First的相关文章

学习Entity Framework 中的Code First

这是上周就写好的文章是在公司浩哥的建议下写的本来是部门里面分享求创新用的这里贴出来分享给大家.   最近在对MVC的学习过程中接触到了Code First这种新的设计模式感觉很新颖并且也体验到了这种方式所带来的便利.这里将我的一些理解分享出来. 需要了解的概念 POCO POCOPlain Old CLR Object的概念是从java的POJO借用而来而两者的含义是一致的不同的仅仅是使用的语言不一样.所以POCO的解释就是"Plain Old C# Object".POJO的内在含义

【原】尝试 Entity Framework POCO功能+Code First

Entity Framework 2.0中添加了的支持POCO(Plain Old CLR Object)的功能,这使得EF的功能越来越强大了. 下面分享一下我自己摸索学习的一个例子: 第一步:创建WinFrom项目(只是用来测试) 第二步:设计实体模型以及关联 在项目上 右击→添加新建项目→选择数据→Ado.Net实体模型 如图所示:   选择 创建 空模型 ,如下图所示:   设计模型,添加属性以及添加表的关联. 在实体设计窗口中,右击→属性→代码生成策略=>无  ,这一步就是去掉EF自动代

一起谈.NET技术,Entity Framework 4.1 Code First 学习之路(二)

写系列的上一篇已经是很久之前的事儿了= =在此期间,EF 4.1的RTW都已经出来了,NH 3.2的Alpha已经2了...其实不是我懒,工作中也在一直使用EF 4.1.主要是上次承诺过的一个Update功能搞不定= = 总之这一次的目标是: 实现一个完整的IRepository(添加增删改能力) 领域对象的继承 事物 首先来看IRepository 我的接口如下: public interface IRepository<TEntity>where TEntity : IEntity{ IE

Entity Framework Power Tools简介

在Entity Framework中引入Code First的做法已经获得了很多赞誉.尽管这项技术未来还有很长的路要走,但是它已经动摇了ORM.NHibernate的统治地位,微软所做出的进展非常惊人.为了保持这种势头,微软发布了一系列强大的工具,它们能够获取现存数据库的信息,并创建Code First的代码. 乍一看,微软提供的这种方式很奇怪,它会对数据库进行反向工程,生成Code-First模型.但在这背后确实包含不少有用的想法.第一种想法仅仅是具有教育意义.和之前版本的Entity Fra

Entity Framework 4.1正式版发布,徐汇区网站设计

在MIX 11前夕,微软发布了 ADO.NET Entity Framework 4.1 (EF 4.1) 正式版. EF 4.1有哪些新玩新儿? 1. 首先当然是DbContext API,它是基于以前版本中的ObjectContext和其他一些类型抽象出的一个简单的API,针对常用开发场景和编程模式进行了优化.DbContext可以被于Database First, Model First, Code First三种开发模式. 2. Code First是基于Entity Framework

Entity Framework快速入门--索引贴

此系列在不断完善中,希望能将我关于Entity Framework的知识总结整理到这里跟大家分享,也希望得到大家的指点!共同进步,共同提高!谢谢! Entity Framework快速入门 Entity Framework快速入门--实例篇 DatabaseFirst Entity Framework快速入门--IQueryable与IEnumberable的区别 Entity Framework快速入门--ModelFirst Entity Framework快速入门--CodeOnly PO

使用NuGet助您玩转代码生成数据:Entity Framework 之Code First

在Code First中,编写完代码并运行之后,我们的Model会同步到Db中,但是往往我们 需要的是编写完Model就生成数据库,而不是等UI部分完成并运行之后才看到数据库,借助NuGet程序包管理器 可以让我们即时完成Code=>DB. 准备:1.本人开发工具为VS2012,使用的是.NET Framework 4.5 (EF5): 2.然后确保已在VS扩展中安装了最新的"NuGet程序包管理器": 3.常用的三行 NuGet用于EF命令(当然可以直接用命令"get

计算机-entity framework code first连接多数据库的问题

问题描述 entity framework code first连接多数据库的问题 求帮忙,我现在用来自数据库的code first方式连接数据库A,一切正常. 现在想要连接到数据库B,数据库A的表在B中全部都有,结构也都一样,B数据库有很多其他表. 现在的问题是我只修改config里的connectionStrings配置,程序会报" 具有固定名称"MySql.Data.EntityClient"的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载&qu

Entity Framework 5.0系列之Code First数据库迁移

我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Code First如何更新已有的模型呢?今天我们简单介绍一下Entity Framework的数据迁移功能. Entity Framework配置 在开始今天的话题之前先来看一下Entity Framework的配置,因为有很多朋友因为配置文件的问题造成"Migrations"命令执行失败.

Entity Framework 5.0系列之自动生成Code First代码

在前面的文章中我们提到Entity Framework的"Code First"模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework Power Tools如何基于现有数据库生成数据类和数据库上下等. Entity Framework Power Tools 基于现有数据库生成POCO数据类和数据库上下文需要借助Visual Studio一个扩展插件-- Entity Framework Power Tools(一个Code First反向工