对于SQL Server、MySql、Oracle等这些传统的数据库,基本都是关系型数据库,都是体现实体与实体之间的联系,在以前开发时,可能先根据需求设计数据库,然后在写Model和业务逻辑,对于Model类基本都是和表的字段对应着,而表中存的每条记录又和类的实例对象对应着,有了这个对照关系,就是能不能只在一边设计,在数据库设计表或在VS中设计Model,然后直接生成另一边,这样就省了好多时间成本。于是有了ORM,Object Relation Mapping,对象关系映射。既然可以根据Model可以生成数据库,数据库也可以生成Model,Model、数据库又是分离的,我们也可以根据Model生成不同类型(Sql Server\Oracle)数据库,而不同类型的数据库(Sql Server\Oracle)也可以生成同样的Model,而它们共同的纽带就是Mapping。
EF实体框架有3种类型,Data First、Model First、Code First。从今天起,将来的几篇博客可能都是关于Code First的,可能有人会问,其他的呢?对于另外两个我不打算花太多的时间,现在code first用的比较多,而且和其他两个比来说更加方便简单,code first没有包含CSDL(Conceptual Schema Definition Language 概念架构定义语言)、SSDL(Store Schema Definition Language存储架构定义语言)、MSL(Mapping Specification Language 映射规范语言)的映射定义,可是使用基于约定的映射。例如主键,只需要用Id命名属性或以Id结尾,这种会自动映射到主键上。对于上面的CSDL、SSDL、MSL根据中文应该也能猜出一二来,其实CSDL概念架构定义语言,定义概念的嘛,当然是定义.Net类的,而SSDL存储架构定义,既然是存储,肯定是数据库啊,所以它是描述表及其关系的结构。而MSL映射规范语言,当然是用来映射的,比如类中的Name属性可能在数据库定义的列名不是name,那怎么办呢?这时有了MSL就好办了,它就是用来描述映射关系的。
上面瞎逼逼半天,实际上今天是想大致演示下code first的用法,做简单的增删改查。
一、Model
首先是创建了一个控制台应用程序EFCodeFirstDemo,又创建了一个存放Model的类库EFCodeFirstModels,以及一个与数据库有关系的类库EFCodeFirstDataAccess,算是三层架构中的DAL,至于BLL先不创建,只是简单的演示。既然是code first,管理对象,那肯定要先有一个Model类,这里在EFCodeFirstDemo中定义了一个Student类。在Student类中使用约定定义StuId为主键,由于默认会把Id结尾的属性作为主键,所以不用特性也可以。
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace EFCodeFirstModels
{
public class Student
{
[Key]
public string StuId { get; set; } public string Name { get; set; } public int Age { get; set; } public Student(string stuId, string name, int age)
{
this.StuId = stuId;
this.Name = name;
this.Age = age;
}
//定义无参数的构造函数主要是因为在通过DbSet获取对象进行linq查询时会报错
//The class 'EFCodeFirstModels.Student' has no parameterless constructor.
public Student() { } }
}
二、DbContext数据库上下文
DbContext数据库上下文,定义了从实体对象到数据库的映射,从数据库中检索数据,就要使用它。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using EFCodeFirstModels;
using System.Configuration; namespace EFCodeFirstDataAccess
{
public class EFCodeFirstDbContext:DbContext
{ public EFCodeFirstDbContext():base("name=MyStrConn")
{
}
public DbSet<Student> Students { get; set; }
}
}
在使用DbContext时要先通过NuGet添加EntityFramework,在类中引入System.Data.Entity,像上面的代码中我们给DbContext指定了数据库连接字符串,名字是MyStrConn,我们可以看下DbContext类的构造函数.
上面提供了几种构造函数,今天主要看下第一个传nameOrConnectionString和无参数的。如果不传参数,它会自定将数据库的名字命名为类库名.类名,像上面的如果不使用无参数的构造函数会创建一个名为EFCodeFirstDataAccess.EFCodeFirstDbContext的数据库。而我们的demo中是使用了参数的,参数的名是nameorConnectionString,注意是or那意味着有两种情况,一种是name,一种是ConnectionString,在上面的参数是"name=XXX",这种是ConnectionString,既然是ConnectionString,那肯定有连接字符串,在哪呢?我开始是写在了EFCodeFirstDataAccess类库中,可以始终报错,报初始化的错误,正确的是写在控制台应用程序中的配置文件中,在配置文件App.config中添加结点。这里也要注意是要提供providerName,而且configSections必须是configuration的第一个结点,我刚才把connectionStrings添加到第一个也是提示错误。
<connectionStrings>
<add name="MyStrConn" providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=CodeFirstDb;Integrated Security=True"/>
</connectionStrings>
我们也可以不使用ConnectionString,而是直接复制数据库名,它会先找配置文件对于的连接字符串,如果未找到,则以它自己命名。
三、简单操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EFCodeFirstModels;
using EFCodeFirstDataAccess; namespace EFCodeFirstDemo
{
class Program
{
static void Main(string[] args)
{
//using能及时释放资源,例如数据库连接异常,可以即使将上下文释放
using (var db=new EFCodeFirstDbContext())
{
Student stu = new Student("", "cuiyanwei", );
db.Students.Add(stu);
db.SaveChanges();
string name= db.Students.Select(p => p.Name).FirstOrDefault().ToString() ;
Console.WriteLine(name); Student stu1 = db.Students.Where(p=>p.StuId=="").FirstOrDefault() ;
stu1.Name = "CYW";
db.SaveChanges(); name = db.Students.Select(p => p.Name).FirstOrDefault().ToString();
Console.WriteLine(name); }
Console.ReadLine(); }
}
}
在上面代码中,主要是先新增一个Student对象然后插入数据库,打印输出此时的name,然后通过数据库上下文找到StuId=0001的学生,将name更改为CYW,
保存到数据库再次打印数据name,从打印结果我们可以看到name最后是CYW,数据库中最后的结果也是CYW。通过Profiler也能查看到sql执行的过程。
EF实体框架之CodeFirst一的更多相关文章
-
EF实体框架之CodeFirst四
在EF实体框架之CodeFirst二中也提到数据库里面一般包括表.列.约束.主外键.级联操作.实体关系(E-R图).存储过程.视图.锁.事务.数据库结构更新等.前面几篇博客把表.存储过程.视图这些算是 ...
-
EF实体框架之CodeFirst五
上一博客学习了下基本的约定配置,留下几个遗漏的,这篇就是学习下遗漏一复杂类型. 一.什么是复杂类型? 书中说道:“复杂类型也可视作值类型(?)可以作为附加属性添加到其他类.复杂类型与实体类型的区别在于 ...
-
EF实体框架之CodeFirst二
在codefirst一中也说了Mapping是实体与数据库的纽带,model通过Mapping映射到数据库,我们可以从数据库的角度来分析?首先是映射到数据库,这个是必须的.数据库里面一般包括表.列.约 ...
-
EF实体框架之CodeFirst七
前面的6篇博客基本把Code First学习的差不多了,今天这篇学习下code first中的并发控制和事务,基本也快学完了,顶多就差数据迁移. 在数据库中也是有锁和事务的概念,在C#中也是存在,当然 ...
-
EF实体框架之CodeFirst六
上午的时候把复杂类型学习了一下,想着趁着周六日把Code First学习完,所以下午还是把Code First中的关系学习下.在数据库中最重要的恐怕就是E-R图了,E-R体现了表与表直接的关系.使用C ...
-
EF实体框架之CodeFirst三
前两篇博客学习了数据库映射和表映射,今天学习下数据库初始化.种子数据.EF执行sql以及执行存储过程这几个知识. 一.数据库初始化策略 数据库初始化有4种策略 策略一:数据库不存在时重新创建数据库 D ...
-
EF实体框架之CodeFirst八
前面七篇基本把Code First学习了一下,不过code first中会出现一个问题,就是数据迁移的问题. 一.数据准备 还是在前面的demo上修改,这次使用Province和City类. publ ...
-
C#.Net EF实体框架入门视频教程
当前位置: 主页 > 编程开发 > C_VC视频教程 > C#.Net EF实体框架入门视频教程 > kingstone金士顿手机内存卡16G仅65元 1.EF实体框架之增加查 ...
-
EF实体框架处理实体之间关联关系与EF延迟机制(下)
在数据库中,表与表之间可能存在多种联系,比如,一对多,多对多的关系.当我们使用逻辑外键在数据库建立两张表之间的关系的时候,我们使用EF实体框架 必然也会将这种关系映射到我们的实体关系中来.所以,在我们 ...
随机推荐
-
Java虚拟机13:互斥同步、锁优化及synchronized和volatile
互斥同步 互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保证手段.同步是指子啊多个线程并发访问共享数据时,保证共享数据在同一时刻只能被一 ...
-
在网页中插入MSN,Skype,QQ的方法
MSN源码: <a href="msnim:chat?contact=come400@hotmail.com" target="blank">可以适 ...
-
如何做一个avalon组件
在avalon1.5中改用更直观的自定义标签来声明组件,废掉ms-widget,引入更强大的生命周期管理,可以让组件任意套嵌. 组件是由JS,HTML,CSS构成 JS 以AMD形式组织,引入HTML ...
-
【转载】C/C++ 函数指针 总结
转载自:http://blog.csdn.net/shihui512/article/details/9787125 什么是函数指针函数指针的声明函数指针的赋值函数指针的使用将函数作为其他函数的参数在 ...
-
【基础】PHP变量及变量作用域
新学PHP,比较有意思的语法,记录下. 1. 变量的作用域 作用域只分两个Global和Local,Global相对于整个.php文件来讲,Local是本地最小范围,是距离变量最近的范围,如:在函数中 ...
-
简单易懂的现代魔法&mdash;&mdash;Play Framework攻略1
哇哈哈,寒假结束啦,于是我又开新坑了....这次的主角可是大名鼎鼎的Play Framework!!那么闲话少说,开始攻略吧! 1.什么是Play Framework? 大名鼎鼎的play frame ...
-
SDL音频播放
gcc -o tutorial03 tutorial03.c -lavutil -lavformat -lavcodec -lz -lm \`sdl-config --cflags --libs` A ...
-
JAVA日期字符串转化,日期加减
SimpleDateFormat函数语法: G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午 (1~12) H 时 在一天中 (0~23) m 分 s 秒 S 毫秒 E ...
-
Swing-布局管理器之FlowLayout(流式布局)-入门
FlowLayout应该是Swing布局管理器学习中最简单.最基础的一个.所谓流式,就是内部控件像水流一样,从前到后按顺序水平排列,直到达到容器的宽度时跳转到第二行.既然是水平排列,那么就存在三种基本 ...
-
Java GC相关知识
Java堆的分类 分为两类:YoungGen和OldGen.其中,YoungGen分为三部分:eden,from survivor和to survivor,比例默认是:8:1:1 PermGen不属于 ...