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使用方法一样
Entity Framework 6.1-Code First的更多相关文章
- Entity Framework 6.x Code Frist For Oracle 实践与注意点
Entity Framework 6.x Code Frist For Oracle 实践与注意点 开发环境 Visual Studio.net 2015/2017 Oracle 11g/12c 数据 ...
- Entity Framework工具POCO Code First Generator的使用
在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一 ...
- 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是一 ...
- 学习Entity Framework 中的Code First
这是上周就写好的文章,是在公司浩哥的建议下写的,本来是部门里面分享求创新用的,这里贴出来分享给大家. 最近在对MVC的学习过程中,接触到了Code First这种新的设计模式,感觉很新颖,并且也体验到 ...
- 转载:学习Entity Framework 中的Code First
看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写 ...
- Entity Framework(EF的Code First方法)
EntityFramework,是Microsoft的一款ORM(Object-Relation-Mapping)框架.同其它ORM(如,NHibernate,Hibernate)一样, 一是为了使开 ...
- Entity Framework应用:Code First的实体继承模式
Entity Framework的Code First模式有三种实体继承模式 1.Table per Type (TPT)继承 2.Table per Class Hierarchy(TPH)继承 3 ...
- Entity Framework应用:Code First模式数据迁移的基本用法
使用Entity Framework的Code First模式在进行数据迁移的时候会遇到一些问题,熟记一些常用的命令很重要,下面整理出了数据迁移时常用的一些命令. 一.模型设计 EF默认使用id字段作 ...
- Entity Framework 6.0 Code First(转)
源自:http://www.cnblogs.com/panchunting/tag/Code%20First/ 1 Conventions 2 Custom Conventions 3 Data An ...
- Entity Framework 4.1 - Code First 指定外键名称
Entity Framework 4.1 中,生成外键的方式有以下几种: 1-指定导航属性,会自动生成外键,命名规则为:“表名_主键名”2-默认情况下与导航属性的主键名称相同的字段会自动被标记为外键, ...
随机推荐
- jquery formValidate demo 采用struts 异步方式检验用户名是否存在
1 login.jsp <%@taglib uri="/struts-tags" prefix="s"%><!DOCTYPE html PUB ...
- 教你50招提升ASP.NET性能(十四):使用startMode属性来减少ASP.NET站点加载时间
(25)Use the startMode attribute to reduce the load time for your ASP.NET site 招数25: 使用startMode属性来减少 ...
- Codeforces Gym 100286G Giant Screen 水题
Problem G.Giant ScreenTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/con ...
- spring-mvc整合freemarker并在ftl模版中显示服务端校验的错误信息,JSR303或者JSR349
写法有多种,应该可以任意组合,最重要的是要引入spring.ftl 1.Bean里面的就不再多写了,来个简单就可以了 @NotEmpty(message="用户密码码不可为空") ...
- 内核映像的形成 —— KBuild体系
1. http://blog.csdn.net/yunsongice/article/details/6046537 2. http://blog.csdn.net/yunsongice/articl ...
- 初步认知MySQL metadata lock(MDL)
http://blog.itpub.net/26515977/viewspace-1208250/ 概述 随着5.5.3引入MDL,更多的Query被“Waiting for table metada ...
- Java_InvokeAll_又返回值_多个线程同时执行,取消超时线程
package com.demo.test4; import java.util.ArrayList; import java.util.List; import java.util.concurre ...
- Android(java)学习笔记99:android的短信发送器研究
1.第一种可以调用系统内部的短信程序. 之前我曾经出现过一个bug就是报错: android.content.ActivityNotFoundException: No Activity found ...
- ReactNative 大图手势浏览技术分析
支持通用的手势缩放,手势跟随,多图翻页 手势系统 通过 PanResponder.create 创建手势响应者,分别在 onPanResponderMove 与 onPanResponderRelea ...
- CSS 实现行内和上下自适应的几种方法
在写一个移动端网页,发现网页的头部搜索框两边各有固定宽度的按钮,搜索框可以根据宽度的变化来改变自己的宽度,达到填充的目的,也就是一种自适应吧,下面写写自己尝试的几种方法 一 利用css3 的width ...