原文: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使用方法一样

Entity Framework 6.1-Code First的更多相关文章

  1. Entity Framework 6.x Code Frist For Oracle 实践与注意点

    Entity Framework 6.x Code Frist For Oracle 实践与注意点 开发环境 Visual Studio.net 2015/2017 Oracle 11g/12c 数据 ...

  2. Entity Framework工具POCO Code First Generator的使用

    在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一 ...

  3. Entity Framework工具POCO Code First Generator的使用(参考链接:https://github.com/sjh37/EntityFramework-Reverse-POCO-Code-First-Generator)

    在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一 ...

  4. 学习Entity Framework 中的Code First

    这是上周就写好的文章,是在公司浩哥的建议下写的,本来是部门里面分享求创新用的,这里贴出来分享给大家. 最近在对MVC的学习过程中,接触到了Code First这种新的设计模式,感觉很新颖,并且也体验到 ...

  5. 转载:学习Entity Framework 中的Code First

    看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写 ...

  6. Entity Framework(EF的Code First方法)

    EntityFramework,是Microsoft的一款ORM(Object-Relation-Mapping)框架.同其它ORM(如,NHibernate,Hibernate)一样, 一是为了使开 ...

  7. Entity Framework应用:Code First的实体继承模式

    Entity Framework的Code First模式有三种实体继承模式 1.Table per Type (TPT)继承 2.Table per Class Hierarchy(TPH)继承 3 ...

  8. Entity Framework应用:Code First模式数据迁移的基本用法

    使用Entity Framework的Code First模式在进行数据迁移的时候会遇到一些问题,熟记一些常用的命令很重要,下面整理出了数据迁移时常用的一些命令. 一.模型设计 EF默认使用id字段作 ...

  9. Entity Framework 6.0 Code First(转)

    源自:http://www.cnblogs.com/panchunting/tag/Code%20First/ 1 Conventions 2 Custom Conventions 3 Data An ...

  10. Entity Framework 4.1 - Code First 指定外键名称

    Entity Framework 4.1 中,生成外键的方式有以下几种: 1-指定导航属性,会自动生成外键,命名规则为:“表名_主键名”2-默认情况下与导航属性的主键名称相同的字段会自动被标记为外键, ...

随机推荐

  1. 目录启动CXF启动报告LinkageError异常以及Java的endorsed机制

    本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ Exception in thread "main" java.lang.LinkageError: JA ...

  2. Codeforces Gym 100513D D. Data Center 前缀和 排序

    D. Data Center Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560/proble ...

  3. 读《C# 和 Java 的比较》有感

    网上的一篇<C# 和 Java 的比较>(或者叫<Java 和 C# 的比较>)写的挺不错的,今天忽然搜索到. 自己刚刚接触C#,也不由自主地随时都拿来和Java做对比,所以就 ...

  4. webqq 获得好友列表hash算法 获得最新hash的方法

    webqq获得好友列表的hash算法,大约每一个月中旬会变动一次.知道怎么获得他就能够了. js文件路径 http://web.qstatic.com/webqqpic/pubapps/0/50/eq ...

  5. struts2源代码学习之初始化(一)

    看struts2源代码已有一段时日,从今天開始,就做一个总结吧. 首先,先看看怎么调试struts2源代码吧,主要是下面步骤: 使用Myeclipse创建一个webproject 导入struts2须 ...

  6. Asp.Net页面(母版页)加载顺序

    ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件不会 ...

  7. Android腾讯微博开发之随机字符串与签名实现

    Android腾讯微博开发入门之随机字符串与签名实现   直接上代码   1.Utils类,包括签名和随机字符串   import java.util.Random; import javax.cry ...

  8. IOS AutoLayout 文章

    开始iOS 7中自动布局教程(一) 开始iOS 7中自动布局教程(二) 代码的方式自动布局 自动布局时计算Cell高度

  9. [转]UINavigationController 返回的方法汇总

    [html] view plaincopy [self.navigationController popViewControllerAnimated:YES]; UINavigationControl ...

  10. C# 之 获取服务器IP,客户端IP以及其它

    1.获取客户端IP:Request.ServerVariables.Get("Remote_Addr").ToString(); 2.获取客户端主机名:Request.Server ...