• 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");
            }
        }
    }
  • 相关阅读:
    【嵌入式硬件Esp32】Ubuntu18.04 更换阿里云软件源
    【嵌入式硬件Esp32】Ubuntu 1804下ESP32交叉编译环境搭建
    【嵌入式硬件Esp32】Eclipse c++切换回英文方法
    Ant Design使用问题记录
    C#调用python脚本
    C# 6新特性简单总结
    ASP.NET动态网站制作(30)-- WEBService
    ASP.NET动态网站制作(29)-- 正则
    ASP.NET动态网站制作(28)-- 三层框架(2)
    ASP.NET动态网站制作(27)-- 三层框架(1)
  • 原文地址:https://www.cnblogs.com/Tanqurey/p/12439244.html
Copyright © 2020-2023  润新知