EasyUIEntity Framework 6.1-Code First【转】

 

Entity Framework 6.1-Code First

分类: Entity
Framework
2014-04-21 14:56 2034人阅读 评论(0)
收藏;) 举报

entityentity
framework框架

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,回车执行

EasyUI 1

会见在路面临开创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
    学习系列1–概略、安装

entity framework
天地模型
单元测试
控制台
extension

Entity Framework Code
First学习日记(2)

啊ASP.NET MVC应用创建Entity
Framework数据模型(1/10)

构建ASP.NET
MVC4+EF5+EasyUI+Unity2.x渐的后台管理体系(14)-系统总结

Entity Framework 5.0多重之自动生成Code
First代码

RDIFramework.NET(.NET快速信息化系统出框架)
Web版介绍

ADO.Net Entity Framework:
动态修改连接串信息

Asp.Net的Forms验证,解决Cookie和Seesion失效时。

AOP技术介绍--(.Net平台AOP技术研究)

WPF的规律同MVVM模式之思维