Entity Framework 6.1-Code First

news/2024/7/7 1:25:51 标签: 数据库, 测试
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使用方法一样



posted on 2014-12-07 15:54 NET未来之路 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4149497.html


http://www.niftyadmin.cn/n/1450256.html

相关文章

python微信框架_WeRoBot 1.1.0,Python 的微信公众号开发框架

WeRoBot 1.1.0 发布了。有以下更新&#xff1a;为 werobot.robot.BaseRoBot 增加 client property 允许在初始化 werobot.robot.BaseRoBot 时传入 Config 。注意如果传入了 config &#xff0c; BaseRoBot 会忽略除 config 与 logger 外的其他所有的参数。 deprecate werobot.r…

uva 10548 - Find the Right Changes(拓展欧几里得)

题目链接&#xff1a;uva 10548 - Find the Right Changes 题目大意&#xff1a;给定A&#xff0c;B&#xff0c;C&#xff0c;求x&#xff0c;y&#xff0c;使得xAyBC&#xff0c;求有多少种解。 解题思路&#xff1a;拓展欧几里得&#xff0c;保证x&#xff0c;y均大于等于0&…

mac下安装redis以及redis扩展-----xampp

第一步&#xff1a;安装基础支持curl -O http://mirrors.kernel.org/gnu/m4/m4-1.4.13.tar.gztar -xzvf m4-1.4.13.tar.gzcd m4-1.4.13./configure –prefix/usr/localmakesudo make installcd ..curl -O http://mirrors.kernel.org/gnu/autoconf/autoconf-2.65.tar.gztar -xzv…

mybatis主键回填mysql_MyBatis 示例-主键回填

测试类&#xff1a;com.yjw.demo.PrimaryKeyTest自增长列数据库表的主键为自增长列&#xff0c;在写业务代码的时候&#xff0c;经常需要在表中新增一条数据后&#xff0c;能获得这条数据的主键 ID&#xff0c;MyBatis 提供了实现的方法。StudentMapper.xmluseGeneratedKeys&qu…

python编程求1+2+3+....+100的和_python实现1+2+3+...求和的办法

今天下午上python课的时候&#xff0c;老师留了一个小编程题&#xff0c;求1234...100,然后的就大展身手&#xff0c;写了下面的代码&#xff1a;defsum():print("如果中途想终止&#xff0c;请输入no")for i in range(1000): nstr(input("请输入累加到的数字&a…

C# 客户端服务端的编写

客户端的代码 class client{public void mehod(){TcpClient tcp new TcpClient();tcp.Connect(IPAddress.Parse("192.168.0.168"), 23850);NetworkStream stream tcp.GetStream();string cmd "demo TESTING";byte[] outbytes System.Text.Encoding.ASC…

一个检测一个字符串在另一个字符串当中出现几次的函数(转)

U2 Forum rautinee原创$ $http://u2bbs.126.com$ 一个网友问就写了一个,:) Function CheckTheChar(TheChar,TheString) TheChar"要检测的字符串" TheString"待检测的字符串" if inStr(TheString,TheChar) then for n 1 to Len(TheString) if Mid(TheString…

JAVA2的三个版本

企业版(Java EE) Java EE是一种利用Java2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java2平台的标准版&#xff0c;Java EE不仅巩固了标准版中的许多优点&#xff0c;例如“编写一次、随处运行”的特性、方便存取数…