依照代码自动生成数据库,永利会娱乐你能够一向访谈这一个网址 

本文转自:http://www.cnblogs.com/tomin/archive/2012/02/29/MVC_EntityFramework.html

 

 

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

永利会娱乐 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
领域模型
单元测验
控制台
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代码

瑞虎DIFramework.NET(.NET连忙消息化系统开垦框架)
Web版介绍

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

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

AOP手艺介绍--(.Net平台AOP能力研商)

WPF的原理与MVVM格局的构思

 

近来,用到了ASP.NET  MVC Entity Framework 
开辟了一些门类,感到照旧特别好用了,那让自家见证了微软技巧的向上:

 

-通过那一个图,大家很清晰的见到,数据访谈格局的变动。

借使,你想打听,ADO.NET Entity Framework, 你能够一贯访谈那么些网址 
Entity
Framework

只要,你想询问ASP.NET MVC ,
你可以直接访问那么些网站:MVC

上边笔者介绍一下Entity Framework 的一部分施用:

 

 

在园子里,小编看来众多有关MVC的上书,比比较多的行使的是Model First, or Schema
First . 在此间,小编将整合ASP.NET MVC 3.0 , 做二个Entity Framework CODE
FIENCOREST的示范,希望我们能具有协助。非常是,对您想架构Mini项指标时候,那几个动用是非常有帮扶的.

尝试境遇:

OS: Windows Server 2008R2, Windows 7

DE: VS2010 + MVC 3.0+Entity Framework+ SQL Server 2008 R2

一、创制MVC
3.0的网站项目,那和我们创设别的的MVC项目是均等的。注意:在创设在此以前,记得先安装MVC
3.0, Entity Framework. 创设完之后,你将会看出杰出的MVC
形式,Model->View->Control

二、在Model中增多2个类,二个是Restaurant,七个是OdeToFoodDB, 定义如下:

Restaurant

using System; using System.Collections.Generic; using System.Linq;
using System.Web;
namespace MVCET.Models {     public class Restaurant     {
        public int ID { get; set; }
        public string  Name { get; set; }
        public string State { get; set; }
        public Adress  Adress { get; set; }                } }

 

OdeToFoodDB

using System; using System.Collections.Generic; using System.Linq;
using System.Web; using System.Data.Entity;
namespace MVCET.Models {     public class OdeToFoodDB:DbContext
    {        
        public DbSet<Restaurant> Restaurants { get; set; }
        public DbSet<Reviewers> Reviewer { get; set; }     } }

OdeToFoodDB, 注意这些类必须连续 DbContext

下一场,在webConfig中加多二个数据库连接字符串,如下:

 <configuration>   <connectionStrings>     <add
name=”ApplicationServices”          connectionString=”data
source=.\SQLEXPRESS;Integrated
Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User
Instance=true”          providerName=”System.Data.SqlClient” />    
<add name=”OdeToFoodDB”          connectionString=”data
source=.\SQLEXPRESS;Integrated Security=SSPI;initial
catalog=OdeToFoodDB;”     providerName=”System.Data.SqlClient”/>
  </connectionStrings>

三、在Control 中增添RestaurantControl
类,再为Index()函数加多View. 况且选取强类型去显示数据。那时候,view 会自动绑上数据,呈现数据。那时候,确定未有数量,借使要有数量怎么弄呢?那时候就到依照代码生成数据库。
四、在VS 中选拔服务器浏览器窗口,在数据库的节点上摘取”Add Connection
….” 中文版的正是“增添新的连年”。写上数据库的服务器名称,在填上数据库的名字,如下图所示: 

 

点击ok,然后创制数据库,借使,有对话框弹出来,选取”Yes” 就行了。那时候,系统就能自动生成数据库了,如下图所示

 

咱俩,看到Restaurants
表中的字段和大家定义的Restaurant中字段的名字基本类似的  
到前几天结束,大家曾经根据代码结构调换了多少库.然则,要是Restaurant
中的字段有所改观,怎办办吧?那时候,就要到Drop之前的数据库,然后,重现创立数据库 
五、类发生了更换,数据库也发生相应的转移:
在Global.asax 中的 Application_Start() 函数中,增多以下的代码

 

protected void Application_Start()         {
           // Database.SetInitializer(new DropCreateDatabaseIfModelChanges<OdeToFoodDB>()); 
            Database.SetInitializer(new OdeToFoodDBInitializer()); 
            AreaRegistration.RegisterAllAreas();
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);         }

 

你也足以写四个类承袭DropCreateDatabaseIfModelChanges<OdeToFoodDB>,
如下代码所示,你就能够毫无注释的哪一行代码了

OdeToFoodDBInitializer

public class OdeToFoodDBInitializer :
        DropCreateDatabaseIfModelChanges<OdeToFoodDB>     {
        protected override void Seed(OdeToFoodDB context)         {
            base.Seed(context);
            context.Restaurants.Add(                 new Restaurant()
                {                     Name = “qitian”,
                    Adress = new Adress() { Street = ” Nanjiang RD, MD”, City = “Shanghai” }
                });
            context.Restaurants.Add(                 new Restaurant()
                {                     Name = “haiyun”,
                    Adress = new Adress() { Street = ” Dongchuan RD, MD”, City = “Shanghai” }
                });             context.Restaurants.Add(
                new Restaurant()                 {
                    Name = “qitian”,
                    Adress = new Adress() { Street = ” Beijing RD, HF”, City = “Guangdong” }
                });
            context.Restaurants.Add(                 new Restaurant()
                {                     Name = “Lantian”,
                    Adress = new Adress() { Street = ” Wuhan RD, HF”, City = “Guangdong” }
                });
            context.Reviewer.Add(new Reviewers() { 
            Name=”Tomin”, Sex=”Female”});
            context.Reviewer.Add(new Reviewers()             {
                               Name = “Tony”,
                Sex = “Male”             });
            context.SaveChanges();                          }     }

双重运转运用程序,会给你一个意外的结果,你会惊叹的。

MVCET.zip

相关文章