EF 示例
EF有三种数据库访问方式,这里只介绍Code First。
1、DB First,类似Linq to sql中拖拽一个DB到方案中
2、Model First,没试过,不能自动生成数据库只能生成表
3、Code First,手写实体类,经过配置后,EF会自动创建数据库和表
Code First配置需经过两步
一、手写实体类,实体类的类名对应着数据库的表名
public class Sys_User
{
[Key]
public int UserId { get; set; }
public string UserName { get; set; }
}
需注意几点:类名不可为数据库的关键字,比如SysUser需改成Sys_User;实体类必须要有Key,EF现在支持组合Key。
二、重写上下文
public class MyContext : DbContext
{
public MyContext() : base("name=DefaultConnection") { }
public DbSet<Sys_User> Sys_User { get; set; }
}
<configuration>
<connectionStrings>
<add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=Biz;user id=sa;password=123456;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;MultipleActiveResultSets=True" />
</connectionStrings>
</configuration>
测试
using System.ComponentModel.DataAnnotations;
using System.Data.Entity; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyContext dbContext = new MyContext();
//到此尚未创建表,需操作一次数据库才行,只要查看一个表,其他表也会自动生成的
dbContext.Sys_User.FirstOrDefaultAsync();
}
} public class Sys_User
{
[Key]
public int UserId { get; set; }
public string UserName { get; set; }
}
public class MyContext : DbContext
{
public MyContext() : base("name=DefaultConnection") { }
public DbSet<Sys_User> Sys_User { get; set; }
}
}
至此,测试结束,数据库自动创建了Biz数据库和Sys_User表。
数据库初始化的三种行为
EF还自动创建了__MigrationHistory表,此表是首次加载以及每次数据库迁移的时候会触发的
自动创建数据库通常不能满足需求,我们希望Sys_User表创建的同时自动生成一笔管理员账号。
1、CreateDatabaseIfNotExists,默认行为,没有就创建一个。
2、DropCreateDatabaseIfModelChanges,如果模型改变后,自动重新创建一个新的数据库,在开发中非常有用,但也要小心,如果开发进行到一半要改表会丢失数据。
3、DropCreateDatabaseAlways,每次运行都重新生成数据库。
using System.ComponentModel.DataAnnotations;
using System.Data.Common;
using System.Data.Entity; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyContext dbContext = new MyContext();
//到此尚未创建表,需操作一次数据库才行
dbContext.Sys_User.FirstOrDefaultAsync();
}
} public class Sys_User
{
[Key]
public int UserId { get; set; }
public string UserName { get; set; }
}
public class MyContext : DbContext
{
public MyContext()
: base("name=DefaultConnection")
{
Database.SetInitializer<MyContext>(new MyInitDB());
}
public DbSet<Sys_User> Sys_User { get; set; }
} public class MyInitDB:CreateDatabaseIfNotExists<MyContext> //: DropCreateDatabaseIfModelChanges<MyContext>
{
/// <summary>
/// 用一些数据对数据库进行初始化
/// 当通过Entity Framework的Code First特性第一次创建数据库架构时,会用到这个类。
/// </summary>
/// <param name="context"></param>
protected override void Seed(MyContext context)
{
InitialSetup(context);
base.Seed(context);
} public void InitialSetup(MyContext context)
{
context.Sys_User.Add(new Sys_User { UserName = "admin" });
context.SaveChanges();
}
}
}
迁移
如果开发到一半有表要调整,当我们调整实体类的时候(且选择的是CreateDatabaseIfNotExists模式)时怎么办。
我们在Sys_User实体类中加如Password属性
public class Sys_User
{
[Key]
public int UserId { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
然后运行,报错:Additional information: The model backing the 'MyContext' context has changed since the database was created. Consider using Code First Migrations to update the database 。
然后我们手动去修改数据库表结构,发现依然不行,报一样的错误。就是表__MigrationHistory在作怪。
正确的做法是:
在Nuget Manager下运行Enable-Migrations
Each package is licensed to you by its owner. Microsoft is not responsible for, nor does it grant any licenses to, third-party packages. Some packages may include dependencies which are governed by additional licenses. Follow the package source (feed) URL to determine any dependencies. Package Manager Console Host Version 2.7.40911.287 Type 'get-help NuGet' to see all available NuGet commands. PM> Enable-Migrations
之后在Solution中会生成Migrations文件夹,里面的文件看一下即可,不用太关心。
继续在Nuget Manager下运行Add-Migrations,并输入Name:AddTest后,会看到在Migrations文件夹下产生一笔新的文件:201603220556041_AddTest.cs
namespace ConsoleApplication1.Migrations
{
using System;
using System.Data.Entity.Migrations; public partial class AddTest : DbMigration
{
public override void Up()
{
AddColumn("dbo.Sys_User", "Password", c => c.String());
} public override void Down()
{
DropColumn("dbo.Sys_User", "Password");
}
}
}
继续在Nuget Manager下运行update-database,运行后可发现数据库Sys_User表中已生成Password字段,至此迁移结束。
注意看数据库中的__MigrationHistory表,此时多了一笔数据,就是刚刚的迁移记录!!
MigrationId
-------------------------------
201603220546077_InitialCreate
201603220556041_AddTest
(2 row(s) affected)
EF 示例的更多相关文章
- 微软官方 Github 上的 EF 示例项目 EntityFramework.Docs
项目地址:https://github.com/aspnet/EntityFramework.Docs/tree/master/samples/core 谢谢浏览!
- WPF+MVVM+EF示例1
实现了那些功能,先看看效果图: 项目工程目录: 接下来开始具体的步骤: 第一步:在VS中新建工程 第二步:使用NuGet 安装EntityFramework 第三步:使用NuGet 安装EntityF ...
- 【函数】oracle translate() 详解+实例
一.语法: TRANSLATE(string,from_str,to_str) 二.目的 返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string.TRAN ...
- 【JAVAWEB学习笔记】25_Linux基础
Linux基础 学习目标 1.了解Linux的简介与安装 2.掌握Linux常用的命令 3.掌握Linux系统上JDK.Mysql.Tomcat的安装 一.Linux的简介 1.Linux的概述 Li ...
- Linux 常用命令之二
整理以前学习Linux的笔记. 查找目录.查看当前所在路径.新建文件.查看文件内容.修改文件内容.压缩文件操作.搜索命令.管道命令.查看进程.终止进程.查看端口. 7,命令find--查找目录 fin ...
- 一些常用的基础Linux操作指令
复习的时候顺便分享我学的知识,虽不是什么牛的技术分享,只是一些基础,基础打好了技术慢慢就提高了!一起加油一起共勉! 具体的vi和vim命令集太多了,以后的随笔我也会分享出来,没必要全记住,记住常用的就 ...
- 【JAVAWEB学习笔记】26_Linux基础:简介安装、常用命令和JDK、Mysql、Tomcat的安装
Linux基础 学习目标 1.了解Linux的简介与安装 2.掌握Linux常用的命令 3.掌握Linux系统上JDK.Mysql.Tomcat的安装 一.Linux的简介 1.Linux的概述 Li ...
- Linux的基本命令总结
服务器版的Linux安装完毕了,但没有图形化界面,我们只能通过控制台去操作系统,我们就要使用类似DOS命令的Linux命令去操作系统,那么下面我们就进行Linux的命令的学习.Linux命令成百上千, ...
- Linux学习记录(一)
1.Linux的简介 1.1.Linux的概述 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境.Linux是由Linus Torvalds(林 ...
随机推荐
- 使用Settings.settings存储用户的个性化配置
1.在vs中设计要存储的字段,如:zbl,注意范围选择用户 读取: var aa = Properties.Settings.Default.zbl; 写入: Properties.Settings. ...
- Python基础教程-第一章-变量、函数、字符串
1.1变量 变量基本上就是代表(或者引用)某个值的名字,举例来说,如果希望用x代表3,只需要执行下面的语句即可: >>>x = 3 这样的操作称为赋值(assignment),值3赋 ...
- IIS调试技巧
VS2010如何调试IIS上的网站 通常,我们在Visual Studio里调试ASP.NET网站,都是加个断点,然后按F5,在VS自带的虚拟服务器下调试的.但有时候,VS自带的服务器弱爆了,无法满足 ...
- Android调用相册拍照控件实现系统控件缩放切割图片
android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家 package cn.m15.test; import java.io.By ...
- c语言 四种方法调用数组
#include <stdio.h> /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维的长度 * * ...
- DDOS的攻击原理和防护指南(转)
DDOS的攻击原理和防护指南 作者:冰盾防火墙 网站:www.bingdun.com 日期:2008-01-07 我们现在来分析DDOS的攻击原理. 首先,DDOS是英文Distribut ...
- 《Java中方法的重写》
//方法的重写 /* 注意:方法的重写要遵循“两同两小一大”规则 “两同”即方法名相同.形参列表相同: “两小”(1)指的是子类方法返回值类型比父类方法的返回值类型更小或相等,[什么意思?] (2)子 ...
- 2015-微软预科生计划-面试题-Swimming Plans
http://hihocoder.com/problemset/problem/1188 题目大意 Steven在时刻T到达了室内游泳池. 游泳池一共有N条泳道,游泳池两侧分别标记为0和1. 已知除了 ...
- C# winform应用程序仅能打开一个进程运行
判断程序是否已经运行,使程序只能运行一个实例: 方法1: //这种检测进程的名的方法,并不绝对有效.因为打开第一个实例后,将运行文件改名后,还是可以运行第二个实例. private static bo ...
- 对于EL表达式和ONGL表达式区别的相关理解
java程序跑起来之后,会有一个内存空间分配出来,存入用到的值,这个值的周围就是上下文空间,而九大内置对象等,都在这个值的周围放着,像这样: el 就只能获取value stack 周围 的数据,va ...