EF| CodeFirst 代码先行

Posted 260250932

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF| CodeFirst 代码先行相关的知识,希望对你有一定的参考价值。

CodeFirst 实例一

技术分享

1.新建一个WebForm项目,名字就叫CodeFirstEF

2:在项目中添加引用EF所需要的5个核心类库:(如果找不到这几个类库,可以新建基于数据库的ADO.NET 实体数据模型,然后从里面拷贝)

       1. EntityFramework  

2. System.Data.Entity

3. System.ComponentModel.DataAnnotations

4. System.Runtime.Serialization

5. System.Security

3:EF需要依赖Web.config配置文件中的三个节点。我需要将这三个节点拷贝到项目的Web.config文件中的<configuration>节点下。这三个节点就是:

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <!--  
  4.   有关如何配置 ASP.NET 应用程序的详细信息,请访问  
  5.   http://go.microsoft.com/fwlink/?LinkId=169433  
  6.   -->  
  7.   
  8. <configuration>  
  9.     
  10.   <!--要将以下个3节点加入到Web.config文件中来;当然 <system.web>这个节点本身就存在的-->  
  11.   <configSections>  
  12.     <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->  
  13.     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />  
  14.   </configSections>  
  15.   <system.web>  
  16.     <compilation debug="true" targetFramework="4.5" />  
  17.     <httpRuntime targetFramework="4.5" />  
  18.   </system.web>  
  19.   <connectionStrings>  
  20.     <!--如果从别处拷贝过来的话,这需要将connectionString的值修改成我们自己需要的连接字符串。如果是使用的ADO.NET的话还需要将providerName的值修改成providerName="System.Data.SqlClient"-->  
  21.     <add name="ConnStr" connectionString="server=.;database=MySales ;uid=sa;pwd=123456;" providerName="System.Data.SqlClient" />  
  22.   </connectionStrings>  
  23.   <entityFramework>  
  24.     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">  
  25.       <parameters>  
  26.         <parameter value="v11.0" />  
  27.       </parameters>  
  28.     </defaultConnectionFactory>  
  29.   </entityFramework>  
  30. </configuration>  
<?xml version="1.0" encoding="utf-8"?>

<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
  
  <!--要将以下个3节点加入到Web.config文件中来;当然 <system.web>这个节点本身就存在的-->
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <connectionStrings>
    <!--如果从别处拷贝过来的话,这需要将connectionString的值修改成我们自己需要的连接字符串。如果是使用的ADO.NET的话还需要将providerName的值修改成providerName="System.Data.SqlClient"-->
    <add name="ConnStr" connectionString="server=.;database=MySales ;uid=sa;pwd=123456;" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

 

4.我们想使用EF去访问数据库,就必须要定义一个EF上下文容器类

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Data.Entity; //要想使用DbContext类就必须要引入一个类库  
  6. using CodeFirstEF.Model;  
  7.   
  8. namespace CodeFirstEF.EFlib  
  9. {  
  10.     //BaseDbContext类继承了BaseDbContext类后,它就是一个上下文容器类了  
  11.     public class BaseDbContext:DbContext  
  12.     {  
  13.         //这个类将来要被实例化的,实例化应该初始化ADO.NET的连接字符串,所以这里调用父类一个带参数的构造函数,指明去Web.config文件去<connectionStrings>节点下找到Name为ConnStr的节点值去初始化这个ADO..NET连接字符串  
  14.         public BaseDbContext() : base("name=ConnStr")  
  15.         {  
  16.             //告诉EF容器,如果没有ConnStr连接字符串中配置的数据库,则自动创建这个数据库。(我们ConnStr连接字符串中配置的数据库名字叫MySales,如果我们SQL Server中不存在这个MySales数据库则自动创建这个数据库)  
  17.             base.Database.CreateIfNotExists();  
  18.           
  19.         }  
  20.   
  21.         //public DbSet<UserInfo> UserInfo{get;set;} //可建立这个属性,也可以不建立,如果不建立的时候,直接使用db.Set<UserInfo>().Add(model);来增加数据  
  22.     }  
  23. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity; //要想使用DbContext类就必须要引入一个类库
using CodeFirstEF.Model;

namespace CodeFirstEF.EFlib
{
    //BaseDbContext类继承了BaseDbContext类后,它就是一个上下文容器类了
    public class BaseDbContext:DbContext
    {
        //这个类将来要被实例化的,实例化应该初始化ADO.NET的连接字符串,所以这里调用父类一个带参数的构造函数,指明去Web.config文件去<connectionStrings>节点下找到Name为ConnStr的节点值去初始化这个ADO..NET连接字符串
        public BaseDbContext() : base("name=ConnStr")
        {
            //告诉EF容器,如果没有ConnStr连接字符串中配置的数据库,则自动创建这个数据库。(我们ConnStr连接字符串中配置的数据库名字叫MySales,如果我们SQL Server中不存在这个MySales数据库则自动创建这个数据库)
            base.Database.CreateIfNotExists();
        
        }

        //public DbSet<UserInfo> UserInfo{get;set;} //可建立这个属性,也可以不建立,如果不建立的时候,直接使用db.Set<UserInfo>().Add(model);来增加数据
    }
}

现在就可以使用这个EF容器类了

 

新建一个Web窗体

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7.   
  8.   
  9. namespace CodeFirstEF  
  10. {  
  11.     using CodeFirstEF.EFlib;  
  12.     using CodeFirstEF.Model;  
  13.     public partial class WebForm1 : System.Web.UI.Page  
  14.     {  
  15.         protected void Page_Load(object sender, EventArgs e)  
  16.         {  
  17.             BaseDbContext db = new BaseDbContext();  
  18.   
  19.             UserInfo model = new UserInfo() {UserName = "小肚子", Age = 103 };  
  20.   
  21.             //db.UserInfo.Add(model);//或者采用下面的方式  
  22.             db.Set<UserInfo>().Add(model);  
  23.   
  24.             db.SaveChanges();  
  25.         }  
  26.     }  
  27. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


namespace CodeFirstEF
{
    using CodeFirstEF.EFlib;
    using CodeFirstEF.Model;
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            BaseDbContext db = new BaseDbContext();

            UserInfo model = new UserInfo() {UserName = "小肚子", Age = 103 };

            //db.UserInfo.Add(model);//或者采用下面的方式
            db.Set<UserInfo>().Add(model);

            db.SaveChanges();
        }
    }
}

然后运行,我们会发现SQL Server中已经生成了MySales这个数据库了。同时下面还生成了一个名字为UserInfo的表。同时表中还插入了一条数据。

 

技术分享

 

 

----------------------------------------------

 

CodeFirst 实例二  | 使用三层

 

下面是最新的做做的一个Demo 使用三层

技术分享

技术分享

UI层

WebForm1.aspx

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7.   
  8. namespace WebApp  
  9. {  
  10.     using BLL;  
  11.     using Models;  
  12.     public partial class WebForm1 : System.Web.UI.Page  
  13.     {  
  14.         protected void Page_Load(object sender, EventArgs e)  
  15.         {  
  16.             T_UserInfoBll bll = new T_UserInfoBll();  
  17.             
  18.   
  19.             T_UserInfo user = new T_UserInfo() { Name = "张三丰", Age = 105 };  
  20.             bll.AddData(user);  
  21.   
  22.             var b = bll.QueryWhere(r => r.Age > 10);  
  23.             this.GridView1.DataSource = b;  
  24.             GridView1.DataBind();  
  25.         }  
  26.     }  
  27. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApp
{
    using BLL;
    using Models;
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            T_UserInfoBll bll = new T_UserInfoBll();
          

            T_UserInfo user = new T_UserInfo() { Name = "张三丰", Age = 105 };
            bll.AddData(user);

            var b = bll.QueryWhere(r => r.Age > 10);
            this.GridView1.DataSource = b;
            GridView1.DataBind();
        }
    }
}

BLL层

T_UserInfoBll.cs

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. namespace BLL  
  8. {  
  9.     using DAL;  
  10.     using Models;  
  11.     public class T_UserInfoBll  
  12.     {  
  13.           
  14.         public List<T_UserInfo> QueryWhere(System.Linq.Expressions.Expression<Func<T_UserInfo, bool>> where)  
  15.         {  
  16.             T_UserInfoDal dal = new T_UserInfoDal();  
  17.             return dal.QueryWhere(where);  
  18.         }  
  19.   
  20.         public bool AddData(T_UserInfo model)  
  21.         {  
  22.             T_UserInfoDal dal = new T_UserInfoDal();  
  23.             return  dal.AddData(model);  
  24.         }  
  25.     }  
  26. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BLL
{
    using DAL;
    using Models;
    public class T_UserInfoBll
    {
        
        public List<T_UserInfo> QueryWhere(System.Linq.Expressions.Expression<Func<T_UserInfo, bool>> where)
        {
            T_UserInfoDal dal = new T_UserInfoDal();
            return dal.QueryWhere(where);
        }

        public bool AddData(T_UserInfo model)
        {
            T_UserInfoDal dal = new T_UserInfoDal();
            return  dal.AddData(model);
        }
    }
}

DAL层

T_UserInfoDal.cs

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. namespace DAL  
  8. {  
  9.     using Models;  
  10.     public class T_UserInfoDal  
  11.     {  
  12.         public List<T_UserInfo> QueryWhere(System.Linq.Expressions.Expression<Func<T_UserInfo, bool>> where)  
  13.         {  
  14.             BaseDbContext db = new BaseDbContext();  
  15.             return db.T_UserInfo.Where(where).ToList();  
  16.         }  
  17.   
  18.         public bool AddData(T_UserInfo model)  
  19.         {  
  20.             BaseDbContext db = new BaseDbContext();  
  21.             db.T_UserInfo.Add(model);  
  22.             int isOK = db.SaveChanges(); //返回数据是:已写入基础数据库的对象的数目。  
  23.             return isOK>0;  
  24.         }  
  25.     }  
  26. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DAL
{
    using Models;
    public class T_UserInfoDal
    {
        public List<T_UserInfo> QueryWhere(System.Linq.Expressions.Expression<Func<T_UserInfo, bool>> where)
        {
            BaseDbContext db = new BaseDbContext();
            return db.T_UserInfo.Where(where).ToList();
        }

        public bool AddData(T_UserInfo model)
        {
            BaseDbContext db = new BaseDbContext();
            db.T_UserInfo.Add(model);
            int isOK = db.SaveChanges(); //返回数据是:已写入基础数据库的对象的数目。
            return isOK>0;
        }
    }
}

Models

 

 

  1. using System;  
  2. using System.Collections.Generic;  
  3.   
  4. using System.Linq;  
  5. using System.Text;  
  6. using System.Threading.Tasks;  
  7.   
  8. namespace Models  
  9. {  
  10.     using System.ComponentModel.DataAnnotations;  
  11.     public class T_UserInfo  
  12.     {  
  13.         [Key] //因为这里我们并没有直接添加EF,所以意味着这里没有映射实体类的元数据了。所以这里我们要手动的标注主键  
  14.         public int id { get; set; }  
  15.   
  16.         public string Name { get; set; }  
  17.   
  18.         public int Age { get; set; }  
  19.     }  
  20. }  
using System;
using System.Collections.Generic;

using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Models
{
    using System.ComponentModel.DataAnnotations;
    public class T_UserInfo
    {
        [Key] //因为这里我们并没有直接添加EF,所以意味着这里没有映射实体类的元数据了。所以这里我们要手动的标注主键
        public int id { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }
    }
}

技术分享

 

            

            版权声明:本文为博主原创文章,未经博主允许不得转载。

以上是关于EF| CodeFirst 代码先行的主要内容,如果未能解决你的问题,请参考以下文章

EF-CodeFirst-1 玩起来

EF CodeFirst 通过代码生成数据库

EF架构~codeFirst从初始化到数据库迁移

EF CodeFirst 约束配置

EF 增删改

EF架构~codeFirst从初始化到数据库迁移