初识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 = 1;//修改或者删除必须要有主键 myStudent.FName = "李乾龙"; myStudent.FAge = 12; myStudent.FGender = "男"; myStudent.FEnglish = 50; myStudent.FClassId = 2; 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(32)] public string UName { get; set; } public ICollection<OrderInfo> OrderInfo { get; set; } } //OrderInfo中的代码 public class OrderInfo { [Key] public int Id { get; set; } [StringLength(32)] 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