ef02

1、codefrist与dbFirst

1)dbFirst

先建表,后开发实体

目前已经较少使用了

2)codeFirst

先确定实体模型再建表

3)操作

项目右键——添加——新建项——数据——ADO.NET实体数据模型——

使用dbFirst就选第一个

当我们创建好模型后生成一个后缀为edmx的文件,同时项目下会多一个packages目录

Nuget第三方包管理工具,可以引用第三方包到项目中

1)edmx文件

后缀为tt的文件不要改动,下面有为我们生成的实体类:

// 下面的实体类是根据数据库内容自动生成的
namespace Demo2
{
    using System;
    using System.Collections.Generic;
    
    public partial class Class
    {
        public Class()
        {
            this.user = new HashSet<user>();
        }
    
        public int ClassId { get; set; }
        public string ClassName { get; set; }
    
        public virtual ICollection<user> user { get; set; }
    }
}

此时,如果我们要对生成的实体类进行进一步的修改,不用直接修改上述代码,直接在面板上修改即可

.context.cs结尾的文件也很重要,里面的内容由模板生成

 此时我们编写一个页面并添加事件把数据添加到数据库中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo2
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            LoginUser user = new LoginUser();
            user.Username = "Vitoria";
            user.Password = "abcd";
            //.context.cs中生成的类就是连接数据库的桥梁
            DemoEntities db = new DemoEntities();
            // 将数据添加到EF并添加了添加标记,但还未保存至数据库
            db.LoginUser.Add(user);
            // 保存至数据库,Add标记就是添加操作,生成insert语句
            db.SaveChanges();
            // 拿到刚刚保存数据的id(主键)
            Response.Write(user.Id);

        }
    }
}

来看看ef为我们自动生成的insert语句:

也避免了SQL注入的问题

select @@identity 返回所操作表记录的最后一行的主键

2、使用ef进行查询

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo2
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
       
            DemoEntities db = new DemoEntities();
            //linq表达式
            IQueryable<LoginUser> userList = from u in db.LoginUser
                           where u.Id == 2
                           select u;
            // 如果使用sql语句:select * from [LoginUser] where Id=2
            foreach(LoginUser user in userList)
            {
                Response.Write(user.Username);
            }


        }
    }
}

3、删除

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo2
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
       
            DemoEntities db = new DemoEntities();
            var userList = from u in db.LoginUser
                           where u.Id == 1
                           select u;
            // 返回第一个元素,如果没有的话返回Null
            var user = userList.FirstOrDefault();
            if (user != null)
            {
                db.LoginUser.Remove(user);
                db.SaveChanges();
                Response.Write("已删除");

            }
            else
            {
                Response.Write("未找到所要删除的数据");
            }

        }
    }
}

或者:

4、更新

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo2
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {

            DemoEntities db = new DemoEntities();
            var userList = from u in db.LoginUser
                           where u.Id == 3
                           select u;
            // 返回第一个元素,如果没有的话返回Null
            var user = userList.FirstOrDefault();
            user.Password = "qweabc";
            db.Entry<LoginUser>(user).State =
                System.Data.EntityState.Modified;
            db.SaveChanges();
            Response.Write("完成修改");
        }
    }
}

5、modelFirst

根据业务需求创建实体,并建立各个实体间的关系

1)建立实体

右击项目——添加——新建项——空EF设计器模型——完成

空白处右键——新增——实体——设置类型

可在设计器上继续添加属性,但此时仍未创建实体

空白处右键——添加代码生成项——EF5.xDBContext代码生成器

就会出现tt文件

2)添加关联

空白处右键——新增——关联

多对多需要借助中间表进行关联

3)映射

将上面的实体模型映射到数据库上

空白处右键——根据模型生成数据库,根据提示进行操作,最后会生成一个DDL文件,本质上为一个sql文件

,打开sql文件,右键执行,即可在指定数据库中建立相应的表。但是要注意,如果后续需要根据项目需求添加新的

表或关联等等,生成的sql一定要把新生成的代码拷到数据库进行执行,直接执行将导致原来表中数据遗失。

4)导航属性

向数据库中存储数据:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo2
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Model2Container db = new Model2Container();
            Customer customer1 = new Customer() { Name="John",Pwd="abc123"};
            OtherInfo otherInfo1 = new OtherInfo() { CreateDate = DateTime.Now,Customer=customer1};
            OtherInfo otherInfo2 = new OtherInfo() { CreateDate = DateTime.Now, Customer = customer1 };
       // 注意添加的顺序 db.CustomerSet.Add(customer1); db.OtherInfoSet.Add(otherInfo1); db.OtherInfoSet.Add(otherInfo2); db.SaveChanges(); Response.Write(
"已经存储完成"); } } }

会不会发生某两条成功,一条失败的情况?

saveChanges()已经做了内部的事务处理,不会出现上述情况

 查询数据:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo2
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Model2Container db = new Model2Container();
            var customerList = from c in db.CustomerSet
                               select c;
            foreach(var customer in customerList)
            {
                Response.Write(customer.Name);
                Response.Write("订单时间");
                foreach (var otherInfo in customer.OtherInfo)
                {
                    Response.Write(otherInfo.CreateDate);
                }
            }


        }
    }
}

6、实践

1)查找某一客户的所有订单:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo2
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Model2Container db = new Model2Container();
            var customerList = from c in db.CustomerSet
                               where c.Id == 1
                               select c;
            var customer = customerList.FirstOrDefault();
            foreach(var otherinfo in customer.OtherInfo)
            {
                Response.Write(otherinfo.CreateDate);
            }


        }
    }
}

简化:

            // 直接根据外键进行查找
            var customerList = from o in db.OtherInfoSet
                               where o.CustomerId == 1
                               select o;

2)根据订单号查用户是谁

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo2
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Model2Container db = new Model2Container();
            // 根据导航属性进行查找
            var ohterInfoList = from o in db.OtherInfoSet
                                where o.Id == 2
                                select o;
            var otherInfo = ohterInfoList.FirstOrDefault();
            Customer customer = otherInfo.Customer;
            Response.Write(customer.Name);


        }
    }
}

3)删除某个客户下的所有订单

方法1:

            Model2Container db = new Model2Container();
            var customer = (from c in db.CustomerSet
                            where c.Id == 1
                            select c).FirstOrDefault();
            var otherInfoList = customer.OtherInfo;
            while (otherInfoList.Count> 0)
            {
                var otherInfo = otherInfoList.FirstOrDefault();
                db.Entry<OtherInfo>(otherInfo).State = System.Data.EntityState.Deleted;
                //打上删除标记,自动-1
            }
            db.SaveChanges();

方法2:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo2
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Model2Container db = new Model2Container();
 
            var otherInfoList = from o in db.OtherInfoSet
                                where o.CustomerId == 2
                                select o;
            int count = otherInfoList.Count();
            while (count > 0)
            {
                var otherInfo = otherInfoList.FirstOrDefault();
                db.Entry<OtherInfo>(otherInfo).State = System.Data.EntityState.Deleted;
                db.SaveChanges();
                count--;
            }
            Response.Write("ok");
        }
    }
}
原文地址:https://www.cnblogs.com/Tanqurey/p/12439244.html