初识EF
1. EF是Entity Framework的缩写,全称是(ADO.Net Entity Framework),是以ADO.Net为基础所发展出来的对象关系对应(O/R Mapping)解决方案,早起被称为ObjectSpace.
2. ADO.Net:是在.Net平台下给我们提供了一组操作数据库的类库(API).
3. ASP.Net:是在.Net平台下给我们提供了一种开发Web应用程序的框架。
4.什么是ORM?【是一种思想】
广义上讲:ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的相互转换。
狭义上讲:ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口。理想情况下,基于这样一个面向对象的接口,持久化一个OO对象应该不需要了解任何关系型数据库存储数据的实现细节。
简单的说,ORM是一种思想,而Entity Framework 是实现这种思想的框架。
通过下图来理解ORM:
5. EF的表必须要有主键,有了主键,才能够对表进行操作。
6.模型与数据库之间的映射的三种体现形式:
database first 数据库先行【即先创建数据库,通过数据库进行映射】
Model first 模型先行【即先建立模型,再将模型映射到数据库中,自动创建数据库。】
Code first 没有模型,没有数据库,只有代码
7. 我们先来谈谈第一种方式:【database first】
第一步:首先创建一个控制台应用程序:
第二步:添加"ADO.NET 实体数据模型"程序,如下图:
第三步:点击添加,选择"来自数据库中的EF设计器",然后点击下一步
第四步:建立新的连接,选中你要使用的数据库,如下图步骤:
第五步:选中你要映射的表,点击完成即可。
如下是通过这种方式对数据库进行修改、删除、增加的:
class Program
{
static void Main(string[] args)
{
#region 添加一条用户数据
////第一步:创建访问数据库的统一入口。创建EF的上下文。
//CCDBEntities dbContext=new CCDBEntities(); ////第二步:操作实体
//MyStudent myStudent=new MyStudent();
//myStudent.FName = "李乾龙";
//myStudent.FAge = 12;
//myStudent.FGender = "男";
//myStudent.FMath = 100;
//myStudent.FEnglish = 50;
//myStudent.FClassId = 2;
//myStudent.FBirthday = DateTime.Now;
////第三步:告诉上下文咱们对实体做添加操作。
//dbContext.MyStudent.Add(myStudent); ////第四步:告诉上下文去保存吧
//dbContext.SaveChanges();
#endregion #region 修改
//创建上下文
CCDBEntities dbContext=new CCDBEntities(); //EF的表必须有主键,没有会报错。
//操作实体
MyStudent myStudent = new MyStudent();
//【这里注意:对数据进行修改,如果字段是不可以为空的,那么就必需对该字段进行赋值。】 myStudent.Fid = ;//修改或者删除必须要有主键
myStudent.FName = "李乾龙";
myStudent.FAge = ;
myStudent.FGender = "男";
myStudent.FEnglish = ;
myStudent.FClassId = ;
myStudent.FBirthday = DateTime.Now;
//告诉上下文咱们对实体进行修改操作
//对数据库就行修改
dbContext.Entry(myStudent).State = EntityState.Modified;
////对数据库进行删除
//dbContext.Entry(myStudent).State = EntityState.Deleted;
////给数据库添加一组数据
//dbContext.Entry(myStudent).State = EntityState.Added;
////不对数据库做任何修改
//dbContext.Entry(myStudent).State = EntityState.Unchanged;
//告诉上下文把所有标记了,状态的实体映射回数据库。
dbContext.SaveChanges();//把所有标记为Modified都生成update语句执行到数据库里面去。 #endregion
}
}
8. 第二种方式:Model First 【模型优先】
第一步:首先创建一个控制台应用程序:
第二步:添加"ADO.NET 实体数据模型"程序,如下图:
第三步:点击添加,选择"空EF设计器模型",然后点击完成
第四步:点击完成之后,就会出现如下界面:
第五步:设计模型:如下步骤:
·在空白处右击,然后选择新增-》实体:如下图:
·如下图所示:
·然后选中属性,新增其他列,一般选择"标量属性"
·要想改变每一个实体的属性值,直接选中,然后按F4就可以对其进行修改。
如何建立两个表之间的关系?如下步骤:
·在空白出右击,新增-》关联
·表与表之间无非是:一对一、一对多、多对多
如上图,选中就可以了
注意:不过一般处理多对多关系时,都需要一个中间表,用来连接两个表的对应关系。
所以还得需要一个表来存储两个表的Id,
注意:中间表的命名:R_表一_表二
第六步:新建数据库:
·表模型设计完成之后,在空白处右击选择"根据模型生成数据库(G)… "
·如下所示:
·新建连接,如下图:
注意:可以新建数据库,也可以选择已存在的数据库
第七步:这时候,数据库中就出现了你新建的数据,但是数据库中暂时还没有表,然后当你点击上面的完成之后,就会出现以sql后缀的文件,然后在空白处右击,选择执行就可以了,然后再看看数据库中是否现在出现表了?
示例代码如下:
class Program
{
static void Main(string[] args)
{
//做:添加一条用户信息,并顺便给用户下两个订单 #region 一对多关系
//创建数据库访问上下文。
DBModelFirstContainer dbContext = new DBModelFirstContainer(); ////创建用户实体和订单实体
//UserInfo userInfo = new UserInfo(); //userInfo.UName = "杨";
//userInfo.Age = 18; ////告诉上下文对实体做添加操作。
////dbContext.UserInfoSet.Add(userInfo); //dbContext.Entry(userInfo).State = EntityState.Added; ////创建两个订单
//OrderInfo order1 = new OrderInfo();
//order1.Content = "shit1";
//dbContext.Entry(order1).State = EntityState.Added; ////创建两个订单
//OrderInfo order2 = new OrderInfo();
//order2.Content = "shit2";
//dbContext.Entry(order2).State = EntityState.Added; ////添加实体之间的关联
////处理订单1跟用户的关系
//order1.UserInfoId = userInfo.Id; ////处理订单2跟用户的关系
//order2.UserInfo = userInfo; ////从用户角度去添加关联
//userInfo.OrderInfo.Add(order1);
//userInfo.OrderInfo.Add(order2);
#endregion #region 多对多关系
Department department =new Department(); department.DepName = "研发部";
dbContext.DepartmentSet.Add(department); ActionInfo actionInfo1=new ActionInfo();
dbContext.ActionInfoSet.Add(actionInfo1); ActionInfo actionInfo2 = new ActionInfo();
dbContext.ActionInfoSet.Add(actionInfo2); department.ActionInfo.Add(actionInfo1);
department.ActionInfo.Add(actionInfo2);
#endregion dbContext.SaveChanges();
}
}
9. 第三中方式:Code first 【没有模型,没有数据库,只有代码】
第一步:首先创建一个控制台应用程序:
第二步:添加"ADO.NET 实体数据模型"程序,如下图:
第三步:然后点击确定,选择如下图所示的"空Code First模型",点击完成
第四步:删除刚刚建立的模型。?怎么回事,好不容易建立的模型,为啥又要删了,,这里的主要目的是为了添加几个引用,自己手动添加有点麻烦,所以使用这种方式既可以添加引用集。还有另外一种办法,如下:
除了通过以上的方法快捷添加引用,还可以通过如下方法添加:
·右击解决方案=》选择"管理NuGet程序包",如下图:
·然后安装EntityFramework
这样就快捷的添加引用集了。
第五步:手动敲代码:
//UserInfo中的代码
public class UserInfo
{
public UserInfo()
{
OrderInfo=new HashSet<OrderInfo>();
}
[Key]
public int Id { get; set; }
[StringLength()]
public string UName { get; set; } public ICollection<OrderInfo> OrderInfo { get; set; }
}
//OrderInfo中的代码
public class OrderInfo
{
[Key]
public int Id { get; set; }
[StringLength()]
public string Content { get; set; } public UserInfo UserInfo { get; set; } }
//上下文CodeDbContext中的代码
public class CodeDbContext:DbContext
{
public CodeDbContext():base("name=mysqlserver")
{
if (!this.Database.Exists())
{
this.Database.CreateIfNotExists();
}
} //public void InitDatabase()
//{
// if (!this.Database.Exists())
// {
// this.Database.CreateIfNotExists();
// }
//} public DbSet<UserInfo> UserInfo { get; set; }
public DbSet<OrderInfo> OrderInfo { get; set; }
}
//配置文件【连接字符串】
<connectionStrings>
<add name="mysqlserver" connectionString="Data Source=.;Initial Catalog=DemoCodeFirst;User ID=sa;Password=1q2w3e4R" providerName="System.Data.SqlClient"/>
<!--<add name="mysqlserver" connectionString="server=.;pwd=1q2w3e4R;uid=sa;database=DemoCodeDb7" providerName="System.Data.SqlClient" />-->
</connectionStrings>
//注意:添加连接字符串的时候,要将连接字符串自写在configSections的后面,要是没有就算了。
第六步:在主函数中运行即可。如下代码:
class Program
{
static void Main(string[] args)
{
//创建上下文
CodeDbContext codeDbContext=new CodeDbContext(); //codeDbContext.InitDatabase();
//创建用户实例
UserInfo userInfo=new UserInfo();
userInfo.UName = "taidou";
codeDbContext.UserInfo.Add(userInfo); //创建订单实例
OrderInfo orderInfo1=new OrderInfo();
orderInfo1.Content = "苹果手机";
codeDbContext.OrderInfo.Add(orderInfo1); OrderInfo orderInfo2 = new OrderInfo();
orderInfo2.Content = "苹果电脑";
codeDbContext.OrderInfo.Add(orderInfo2); //设置关系
userInfo.OrderInfo.Add(orderInfo1);
userInfo.OrderInfo.Add(orderInfo2); codeDbContext.SaveChanges();
}
}
Code first的另外一种形式;
参考:http://go.microsoft.com/fwlink/?LinkId=390109
初识EF的更多相关文章
- ASP.NET MVC 基础
ASP.NET MVC oo1 Mvc准备工作课程安排:ORM->AspNet MVC开发环境:VS2012/VS2013SqlServer2008/2005主讲Asp.Net Mvc4 Raz ...
- %E3%80%90%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E3%80%91
"%3Cdiv%20class%3D%22htmledit_views%22%20id%3D%22content_views%22%3E%0A%20%20%20%20%20%20%20%20 ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
- EF Code First学习笔记 初识Code First
Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库. 下面通过一个简单的示例来 ...
- EF Code First学习笔记 初识Code First(转)
Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库. 下面通过一个简单的示例来 ...
- EF CodeFirst 初识
随着EntityFramework的发展,原先的三种方式,{Code First ,Model First,Database First } CodeFirst基本摆脱了另外两种方式 成为了 最受欢 ...
- ORM之EF初识
之前有写过ef的codefirst,今天来更进一步认识EF! 一:EF的初步认识 ORM(Object Relational Mapping):对象关系映射,其实就是一种对数据访问的封装.主要实现流程 ...
- MongoDB【第一篇】MongodDB初识
NoSQL介绍 一.NoSQL简介 NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库. 非关系型数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的. 原始的目的是为 ...
- [ActiveMQ]初识ActiveMQ
初识ActiveMQ ActiveMQ介绍 官方网站:http://activemq.apache.org/ 最新版本:ActiveMQ 5.14.1(2016-10-28) 最新版本下载链接:htt ...
随机推荐
- Oracle中强行断开用户连接的方法
版权声明:本文为博主原创文章,未经博主允许不得转载. 首先查找目标用户的当前进程,注意是serial#而不是serial,网上有的介绍漏掉了#: select sid,serial# from v$s ...
- EPiServer网文
ListItemCollection Rending: http://joelabrahamsson.com/episerver-7-and-mvc-how-to-customize-renderin ...
- Ubuntu下获取Nexus7的Root权限
一.准备 下载获取Root权限的工具包. 下载地址: http://downloadandroidrom.com/file/Nexus7/rooting/Nexus7Root.zip 二.解锁 Ubu ...
- 三点顺序_nyoj_68(计算几何).java
三点顺序 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 3 描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的 ...
- C++面试题一大波
//打印1到最大的n位数. //题目:输入数字n.按顺序打印出从1到最大的n位十进制数.比方: //输入3.则打印出1.2.3一直到最大的3位数999. //[陷阱]:这个题目非常easy想到的办法就 ...
- MyBatis使用Generator自动生成代码
MyBatis中,可以使用Generator自动生成代码,包括DAO层. MODEL层 .MAPPING SQL映射文件. 第一步: 配置好自动生成代码所需的XML配置文件,例如(generator. ...
- 227. Basic Calculator
1. 问题描述 Implement a basic calculator to evaluate a simple expression string. The expression string c ...
- sql server group by having 之复习篇
where 与 having 之间的差别在于where 是分组前的过滤,而having是分组后的过滤 Group By中Select指定的字段限制 示例3 select 类别, sum(数量) as ...
- web开发 - 从零开始 - 03 - 选择器
行间样式>id>class>类型选择>通配符 选择器的优先级一致的情况下,后边的样式会覆盖前边的
- 【WorkTile赞助】jQuery编程挑战#009:生成两个div元素互相追逐的动画
HTML页面: <!-- HTML代码片段中请勿添加<body>标签 //--> <div id="container"> <div id ...