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 来表 ...
随机推荐
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- 配置zsh
.zshrc export ZSH="/root/.oh-my-zsh" ZSH_THEME="robbyrussell" plugins=(git zsh-s ...
- xcode工程编译错误:一般错误总结
1.Apple LLVM 8.0 Error Group /’all-product-headers.yaml’ not found 最近升级了xcode打包后出现了个BUG,记录解决的方法. 现象: ...
- mysql root看不到mysql表
1.首先停止mysql服务:service mysqld stop2.加参数启动mysql:/usr/bin/mysqld_safe --skip-grant-tables & 然后就可以无任 ...
- [development][semaphore] 信号量/信号灯/信号标/旗语
前言: 接续前节 [development][C] 条件变量(condition variables)的应用场景是什么 之前讨论了条件变量的问题, 已经知道在逻辑上, 条件变量(管程)(moniter ...
- AndrewNG Deep learning课程笔记
神经网络基础 Deep learning就是深层神经网络 神经网络的结构如下, 这是两层神经网络,输入层一般不算在内,分别是hidden layer和output layer hidden layer ...
- 使用Python + Selenium破解滑块验证码
在前面一篇博客<使用 Python + Selenium 打造浏览器爬虫>中,我介绍了 Selenium 的基本用法和爬虫开发过程中经常使用的一些小技巧,利用这些写出一个浏览器爬虫已经完全 ...
- 获取链接的参数,判断是否是微信打开,ajax获取数据
//获取链接参数function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + " ...
- 洛谷P4562 [JXOI2018]游戏 数论
正解:数论 解题报告: 传送门! 首先考虑怎么样的数可能出现在t(i)那个位置上?显然是[l,r]中所有无法被表示出来的数(就约数不在[l,r]内的数嘛QwQ 所以可以先把这些数筛出来 具体怎么筛的话 ...
- 【python基础】hmac
[微语]不应当急于求成,应当去熟悉自己的研究对象,锲而不舍,时间会成全一切.凡事开始最难:然而最难的是何以善终 通过哈希算法,我们可以验证一段数据是否有效,方法就是对比该数据的哈希值,例如,判断用户口 ...