Entity Framework Code First(概要)
EF开源项目地址:https://github.com/aspnet/EntityFramework6
MSDN :https://msdn.microsoft.com/en-us/library/aa937723(v=vs.113).aspx
中文:https://msdn.microsoft.com/zh-cn/library/bb399567(v=vs.110).aspx
开始EF
1、安装EF
新建类库项目,打开程序包控制台安装EF
PM>Install-Package EntityFramework
2、配置数据库连接 成功后会在类库项目下自动生成app.config和packages.config(该项目所有包清单),重点看项目配置app.config。给connectionStrings节点添加一个连接
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="Practice" connectionString="Data Source=(localdb)\ProjectsV13;Initial Catalog=Practice.Sample;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
app.config
DbContext
public class PracticeEntitys : DbContext
{
public PracticeEntitys()
: base("Name=Practice")
{ } public new Database Database
{
get { return base.Database; }
} }
DataAnnotation
Table:[ Table("自定义table名")]
Column:[Column("列名",TypeName="varchar")]
Key:设置自定主键,如果不指定该属性,则默认寻找带ID的字段设为主键
DatabaseGenerated表示数据库自动生成,该属性传参数DatabaseGeneratedOption.枚举:Identity:自增长 None:不处理 Computed:表示这一列是计算列
Required:不可为空
NoMapped:不映射某字段加该属性
MaxLength(int)、MinLength(int):设置最大最小长度
ForeignKey("指定列名")和virtual的字段连用设置外键
Index:索引
ComplexType:复杂类型:如可以在下面的commonDate类上加该特性。当然这里推荐使用继承
并发控制:
Timespan和ConcurrentCheck,效果都是一样,原理都是比较当前更新的实体和原数据实体的 对应标识了并发的字段是否一致,不一致就抛出异常
[Table("article")]
public class Article: CommonDate
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public string Title { get; set; }
public Int64 Click { get; set; }
}
public class CommonDate
{
public DateTime CreateDate { get; set; }
public DateTime ModifyDate { get; set; }
}
迁移 Migration
1、开启迁移:
PM>Enable-Migrations
可选参数:
-EnableAutomaticMigrations:开启自动迁移。开启后configuration.cs会设置自动迁移为true,那么这么做实现什么效果呢?不开启状态下我们需要add-migration 然后update迁移到数据库,并生成对应的Migration结构文件;如果开启自动迁移,那么可以省去add的步骤直接update更新到数据库,但是这样也不会生成Migration的结构文件。结果显而易见正常生产环境不建议开启,一般我这里会设置为false。
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
-ContextTypeName 全限定名:如果一个项目多个Context,用该参数指定
-StartUpProjectName:使用项目,和手动在程序包控制台选择使用项目一样效果
-Force:强制
关于错误:找不到配置字符串
(1)、检查配置文件的名称是否和Dbcontext子类设置的名字一样
(2)、确认字符串的情况下如果还报错,先把类库设置为启动项目

2、添加迁移,自定义命名initdatabase,EF会自动根据上面继承DbContext的类的变化和约定的变化,生成Flut的cs文件到Migration文件夹里,并且会自动加上时间戳。如:时间_自定义名.cs
PM>add-migration initdatabase
3、更新到数据库;执行完上面的语句,数据库仍然是不会变化,接下来把表结构更新到数据库
PM>update-database -verbose
4、批量生成脚本
注意:批量生成的时候注意是按照上面 2里面自动添加的 时间顺序执行的。
PM>Update-Database -Script -SourceMigration:开始Migration.cs -TargetMigration: 结束Migration.cs
可以只指定target参数进行回溯
5、迁移检查
public TestDbContext() : base("name=Default")
{
//不会创建数据库,生产环境建议用这个设置,表通过sql来创建或修改
Database.SetInitializer<TestDbContext>(null);
// 数据库不存在时重新创建数据库,会删除主项目或其他插件的表
Database.SetInitializer<TestDbContext>(new CreateDatabaseIfNotExists<TestDbContext>());
//每次启动应用程序时创建数据库,会删除主项目或其他插件的表
Database.SetInitializer<TestDbContext>(new DropCreateDatabaseAlways<TestDbContext>());
//模型更改时重新创建数据库,会删除主项目或其他插件的表
Database.SetInitializer<TestDbContext>(new DropCreateDatabaseIfModelChanges<TestDbContext>());
}
Fluent API
见上篇:http://www.cnblogs.com/xmai/p/3919494.html
Entity Framework Code First(概要)的更多相关文章
- Entity Framework Code First学习系列目录
Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...
- Entity Framework Code First数据库连接
1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句: PM> Insta ...
- Entity Framework Code First属性映射约定
Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...
- Entity Framework Code First关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- Entity Framework Code First执行SQL语句、视图及存储过程
1.Entity Framework Code First查询视图 Entity Framework Code First目前还没有特别针对View操作的方法,但对于可更新的视图,可以采用与Table ...
- Entity Framework Code First使用DbContext查询
DbContext.DbSet及DbQuery是Entity Framework Code First引入的3个新的类,其中DbContext用于保持数据库会话连接,实体变化跟踪及保存,DbSet用于 ...
- Entity Framework Code First添加修改及删除单独实体
对于一个单独实体的通常操作有3种:添加新的实体.修改实体以及删除实体. 1.添加新的实体 Entity Framework Code First添加新的实体通过调用DbSet.Add()方法来实现. ...
- Entity Framework Code First实体对象变动跟踪
Entity Framework Code First通过DbContext.ChangeTracker对实体对象的变动进行跟踪,实现跟踪的方式有两种:变动跟踪快照和变动跟踪代理. 变动跟踪快照:前面 ...
- 旧项目如何切换到Entity Framework Code First
Entity Framework Code First固然是好东西,然而如果是已经存在的旧有项目,如何简单方便的使用切换呢? 这里介绍一个VS的插件Entity Framework Power Too ...
- Entity Framework Code First (三)Data Annotations
Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表 ...
随机推荐
- python web篇 创建数据库
python3 manage.py migrate ls sqlite3 使用单文件数据库,管理方便 运行测试 python manage.py runserver 输入http://127.0.0. ...
- 超级有用的15个mysqlbinlog命令
在MySQL或MariaDB中,任意时间对数据库所做的修改,都会被记录到日志文件中.例如,当你添加了一个新的表,或者更新了一条数据,这些事件都会被存储到二进制日志文件中.二进制日志文件在MySQL主从 ...
- 变长编码表 ASCII代码等长编码
小结: 1.ASCII编码.GBK编码不是变长编码: 2.数据压缩: 示例: aabacdab → 00100110111010 → |0|0|10|0|110|111|0|10| → aabacda ...
- [Day2]变量、数据类型转换以及运算符
1.变量 变量是内存中装载数据的小盒子,你只能用它来存取数据 2.计算机存储单元 (1)计算机存储设备的最小信息单元叫“位(bit)”,“比特位” (2)8个比特位表示一个数据,是计算机的最小存储单元 ...
- day4_函数简单介绍
一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...
- python摸爬滚打之day14----内置函数,递归函数
1.匿名函数 用一句话实现的简单函数. ret = lambda x : x ** 2 即 函数名 = lambda 形参 : 返回值 print(ret(5)) ----> 25 ...
- java JDBC (二) 防止注入/参数化
package cn.sasa.demo2; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pr ...
- 【Python全栈-jQuery】jQuery基础知识
前端学习之jQuery 一. jQuery是什么? <1> jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. < ...
- 【PyQt5-Qt Designer】对话框系列
标准输入对话框(QInputDialog)系列: 主要模块 from PyQt5.QtWidgets import QInputDialog 效果如下: 完整代码: from PyQt5.QtWidg ...
- oracle创建表空间 授权
--创建表空间 临时表空间 create temporary tablespace xiaodai_temp tempfile '/main/app/oracle/oradata/devdb/xiao ...