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-10-20 16:26:51

Entity Framework 6.1-Code First的相关文章

Entity Framework工具POCO Code First Generator的使用

在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一款不错的工具 在Visual Studio中,通过"工具"→"扩展和更新..."来安装Entity Framework Reverse POCO Code First Generator 这里添加一个控制台项目,并在项目中添加POCO Code First Genera

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是一款不错的工具 在Visual Studio中,通过"工具"→"扩展和更新..."来安装Entity Framework Reverse POCO Code First Generator 这里添加一个控制台项目,并在项目中添加POCO Code First Genera

Entity Framework 5.0 Code First全面学习

目录(?)[+] 不贴图片了,太累. Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code First 时基于类定义自动配置概念模型.约定是在 System.Data.Entity.ModelConfiguration.Conventions 命名空间中定义的. 可通过使用数据注释或Fluent API 进一步配置模型.优先级是通过 Fluent API 进行

Entity Framework 5.0 Code First全面学习 (转)

原文地址:感谢原文作者 http://blog.csdn.net/gentle_wolf/article/details/14004345 不贴图片了,太累. Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code First 时基于类定义自动配置概念模型.约定是在 System.Data.Entity.ModelConfiguration.Convention

MVC5 Entity Framework学习之Code First迁移和部署

到目前为止,应用程序一直在本地IIS Express 上运行.为了让其他人能够通过互联网访问你的应用程序,你需要将它部署到WEB服务器. 本文章包含以下内容: 启用Code First迁移,迁移功能能够让你不必重建数据库就可以更改数据模型并将其部署到生产环境. 将应用程序部署到Windows Azure(可选) 1.启用Code First迁移 当你在开发应用程序时,你会对数据模型进行频繁的更改,随着每一次的更改,数据模型与数据库架构将不再一致.你已经对Entity Framework进行了配置

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

使用Entity Framework的Code First模式在进行数据迁移的时候会遇到一些问题,熟记一些常用的命令很重要,下面整理出了数据迁移时常用的一些命令. 一.模型设计 EF默认使用id字段作为主键,如果没有,则需要指定主键. 二.数据迁移基本命令和常用参数 1.安装Entity Framework a.使用命令安装:visual studio工具栏->工具->NuGet 程序包管理器->程序包管理器控制台 输入命令:Install-Package EntityFramework

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

Entity Framework 4.1 中,生成外键的方式有以下几种: 1-指定导航属性,会自动生成外键,命名规则为:“表名_主键名”2-默认情况下与导航属性的主键名称相同的字段会自动被标记为外键,3-通过[ForeignKey]标记指定实体类的属性为外键,4-方式2的升级版,与导航属性的主键名称相同的字段会自动被标记为外键,然后指定字段对应的数据库中的列名 方式3.4可指定生成的数据库中的列名. public class User { public int UserID { get; set

ORM系列之二:Entity Framework(2)Code First

目录 1. Code First是什么? 2. Code First 简单示例 3. 数据存储 4. 迁移 Code First是什么 Code First 顾名思义就是先写代码,当然不是乱写,而是安装一定的约定,先创建实体类,再通过编辑器自动生成数据模型.Code First是EF的三大模式之一,主要使用新的系统开发,对应数据库已存在的情况下不适合. Code First 简单示例 下面通过一个简单的示例,让我们来熟悉一下Code First模式. 第一步:创建一个控制台程序,命名为“EF.C

Entity Framework系列之Code First

第一步:安装Entity Framework6.0 使用管理NuGet程序包界面安装EntityFramework 第二步:新建实体类 using System.ComponentModel.DataAnnotations; namespace EFDemo4 { public class User { [Key] public int Id { get; set; } public string Name { get; set; } } } 第三步:新建实体上下文类 using System.

Entity Framework 6.x - Code First 默认创建数据库的位置

在集成DbContext的派生类中的构造函数里,如果没有指定配置文件中的数据库连接字符串的name,默认就是: Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=ConsoleApplication4.EF6RecipesEntities;Integrated Security=True 注:数据库名称是ConsoleApplication4.EF6RecipesEntities