博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF Code First建库 增删改查
阅读量:5116 次
发布时间:2019-06-13

本文共 5029 字,大约阅读时间需要 16 分钟。

接触过EF的应该都知道EF的编程模型目前有3种。

  • DataBase First:数据库先行
  • Model First:模型先行
  • Code First:代码先行

Code First可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库。

首先来编写个简单的学生(Student)类。通常叫着实体类,最后会生成数据库中的表

class Students    {        [Key]        public int stuId { get; set; }        public string stuName { get; set; }        public string stuAdress { get; set; }        public int stuAge { get; set; }    }

连接上下文DbContext

class StuDbContext : DbContext    {        public DbSet
student { get; set; } }

然后添加一个方法,用于向数据库添加数据

static void Add()        {            Students st = new Students { stuAdress = "中关村", stuAge = 20, stuName = "刘德华" };            using (StuDbContext db = new StuDbContext())            {                db.student.Add(st);                db.SaveChanges();            }        }

然后就是Main方法

static void Main(string[] args)        {            Add();            Console.WriteLine("成功");            Console.ReadKey();        }

程序运行成功后,数据库已经创建了,这里我要说的是,如果你跟我一样是vs2012,本地数据库没有.\sqlexpress,也就是说连接数据库的服务器名称是

local或者就是一个点 .

当你连接数据库的后,明明代码运行成功却没生成数据库而纠结的时候,当时我也是同样的问题。原因很简单。

因为我们没有显示指定连接数据库字符串,Code First会默认生成到 .\sqlexpress,但你本地并没有 .\sqlexpress 这个时候EF就会在 localdb 下生成数据库,其实

当你安装vs2012的时候就已经给你默认安装了 localdb数据库,就像我们安装vs2010的时候默认安装了express版本的数据库,你可以找到路径:C:\Program Files\Microsoft

SQL Server\110\LocalDB 这就是localdb。那代码运行成功。我们连接数据库,服务器名称用:(localdb)\v11.0  身份验证用:windows身份验证  连接即可

 

 

 

 

 

 

 

 

 

 

 

 

 

成功后看数据库,并查询刚插入的数据

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

也许你会疑问 ,那刚生成的数据保存在哪里了,保存在你桌面的用户文件下,

 

 

 

 

 

 

 

 

 

在实际项目中是不会这样搞的。一般都会配置数据库连接字符串。那该怎么配置呢,vs2012建项目时,默认生成了一个App.config配置文件,如果没有的话你可以手动添加

应用程序配置文件。

ps:连接字符串中的Trusted_Connection:Trusted_Connection=false/no时,在连接中要必须指定密码和用户名,当没指明Trusted_Connection的值时, 默认是false/no。当Trusted_Connection=true/yes时。说明server database已设置为用信任连接了, 连接中可以不用指明用户名和密码(当然:你指定用户名和密码也不会去验证。是多此一举)。此时将使用当前的 Windows 帐户凭据进行身份验证。

 

上面写的后。数据库生成的位置是sql安装的位置。如果这样写:

解释:

|DataDirectory| 是指 App_Data目录

Data Source=|DataDirectory|\Demo.mdf
其中|DataDirectory|默认是映射为App_Data的目录。
如 果名为 DataDirectory 的物理目录必须作为元数据路径列表的成员传递,则应在该名称的一边或两边添加空格,

例:Metadata="DataDirectory1 | DataDirectory | DataDirectory2"。ASP.NET 应用程序将 |DataDirectory| 解析为“<应用程序根目录>/app_data”文件夹。

 

 AttachDBFilename=|DataDirectory|\Demo.mdf设定了数据库文件的存放位置:在项目根目录的App_Data文件夹下。

然后修改上下文类  StuDbContext

class StuDbContext : DbContext{
//配置文件中为stuDb的连接字符串,如果没找到,就会以stuDb做为数据库名,创建数据库。    但如果写成name=stuDb格式。当没找到会报异常,No connection string named 'stuDb' could be found in the application config file.
public StuDbContext() : base("stuDb")    { }   public DbSet
student { get; set; } }

 

然后运行程序,看看效果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

接下来看更新 删除 查找 数据

 用过的朋友就知道。code first的查询和添加数据跟DB first,Moedel first一样,不同的是删除和更新。不过都差别不大,先看查询方法

static void Select()        {            StudentContext db = new StudentContext();            var student = from su in db.student                          select su;            foreach (var item in student)            {                string result = string.Format("{0}\t{1}\t{2}\t{3}", item.stuId, item.stuAge, item.stuAdress, item.stuName);                Console.WriteLine(result);            }            //同样可以查询            var st = from su in db.student                     select new                     {                         name = su.stuName,                         age = su.stuAge,                         id = su.stuId,                         adress = su.stuAdress                     };            st.ToList().ForEach(item => Console.WriteLine(item));            Console.ReadKey();        }

 

看运行后的结果图

 

更新数据我们同时用ObjectContext和DbContext来尝试,因为DbContext可以转换为ObjectContext,我们修改记录如下:刘德华改成释小龙,地址改为香港,年龄还是20。

///        /// 修改数据        ///         static void Update()        {            //修改数据是根据主键来找数据的。这也说明建表必须要有key            Student st = new Student();            st.stuId = 1;  //根据id找到记录              st.stuName = "释小龙";            st.stuAdress = "香港";            st.stuAge = 20;            StudentContext db = new StudentContext();            //修改方式一:把DbContext转换成ObjectContext进行数据库更新              ObjectContext context = ((IObjectContextAdapter)db).ObjectContext;  //IObjectContextAdapter所需命名空间:using System.Data.Entity.Infrastructure            db.student.Attach(st);            context.ObjectStateManager.ChangeObjectState(st, EntityState.Modified);  //            db.SaveChanges();            //修改方式二:直接用DbContext更新             db.student.Attach(st);  //待更新的数据附加到db。也就是上下文             db.Entry(st).State = EntityState.Modified; //EntityState 得引用 System.Data.Entity    告诉上下文。状态是修改。 同理把EntityState.Deleted就是删除。             //db.Entry
(st).State = EntityState.Modified; db.SaveChanges(); //保存 }

 

OK 继续,看数据库并且查询看结果

 

 

 

 

 

 

View Code

 

 

好了,这里记录的是我在这几天揣摩过程中一些不惑的知识。同时也是很简单入门的知识点,园子里关于code first的详细介绍已经有很好的文章了,不过学习有好的资料还不够。还要你有好学习态度和专研精神。这里推荐两个链接,好好学咯!

 

转载于:https://www.cnblogs.com/nsky/archive/2013/02/05/2892459.html

你可能感兴趣的文章
树状数组_一维
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
嵌入式软件设计第8次实验报告
查看>>
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
Repeater + Resources 列表 [原创][分享]
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
【转】 FPGA设计的四种常用思想与技巧
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>