1. 程式人生 > >EF| CodeFirst 代碼先行

EF| CodeFirst 代碼先行

task userinfo utf-8 void XML server rmi esp 繼承

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>節點下。這三個節點就是:

[html] view plain copy print?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--
  3. 有關如何配置 ASP.NET 應用程序的詳細信息,請訪問
  4. http://go.microsoft.com/fwlink/?LinkId=169433
  5. -->
  6. <configuration>
  7. <!--要將以下個3節點加入到Web.config文件中來;當然 <system.web>這個節點本身就存在的-->
  8. <configSections>
  9. <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  10. <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  11. </configSections>
  12. <system.web>
  13. <compilation debug="true" targetFramework="4.5" />
  14. <httpRuntime targetFramework="4.5" />
  15. </system.web>
  16. <connectionStrings>
  17. <!--如果從別處拷貝過來的話,這需要將connectionString的值修改成我們自己需要的連接字符串。如果是使用的ADO.NET的話還需要將providerName的值修改成providerName="System.Data.SqlClient"-->
  18. <add name="ConnStr" connectionString="server=.;database=MySales ;uid=sa;pwd=123456;" providerName="System.Data.SqlClient" />
  19. </connectionStrings>
  20. <entityFramework>
  21. <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  22. <parameters>
  23. <parameter value="v11.0" />
  24. </parameters>
  25. </defaultConnectionFactory>
  26. </entityFramework>
  27. </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上下文容器類

[csharp] view plain copy print?
  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. namespace CodeFirstEF.EFlib
  8. {
  9. //BaseDbContext類繼承了BaseDbContext類後,它就是一個上下文容器類了
  10. public class BaseDbContext:DbContext
  11. {
  12. //這個類將來要被實例化的,實例化應該初始化ADO.NET的連接字符串,所以這裏調用父類一個帶參數的構造函數,指明去Web.config文件去<connectionStrings>節點下找到Name為ConnStr的節點值去初始化這個ADO..NET連接字符串
  13. public BaseDbContext() : base("name=ConnStr")
  14. {
  15. //告訴EF容器,如果沒有ConnStr連接字符串中配置的數據庫,則自動創建這個數據庫。(我們ConnStr連接字符串中配置的數據庫名字叫MySales,如果我們SQL Server中不存在這個MySales數據庫則自動創建這個數據庫)
  16. base.Database.CreateIfNotExists();
  17. }
  18. //public DbSet<UserInfo> UserInfo{get;set;} //可建立這個屬性,也可以不建立,如果不建立的時候,直接使用db.Set<UserInfo>().Add(model);來增加數據
  19. }
  20. }
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窗體

[csharp] view plain copy print?
  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. namespace CodeFirstEF
  8. {
  9. using CodeFirstEF.EFlib;
  10. using CodeFirstEF.Model;
  11. public partial class WebForm1 : System.Web.UI.Page
  12. {
  13. protected void Page_Load(object sender, EventArgs e)
  14. {
  15. BaseDbContext db = new BaseDbContext();
  16. UserInfo model = new UserInfo() {UserName = "小肚子", Age = 103 };
  17. //db.UserInfo.Add(model);//或者采用下面的方式
  18. db.Set<UserInfo>().Add(model);
  19. db.SaveChanges();
  20. }
  21. }
  22. }
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

[csharp] view plain copy print?
  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. namespace WebApp
  8. {
  9. using BLL;
  10. using Models;
  11. public partial class WebForm1 : System.Web.UI.Page
  12. {
  13. protected void Page_Load(object sender, EventArgs e)
  14. {
  15. T_UserInfoBll bll = new T_UserInfoBll();
  16. T_UserInfo user = new T_UserInfo() { Name = "張三豐", Age = 105 };
  17. bll.AddData(user);
  18. var b = bll.QueryWhere(r => r.Age > 10);
  19. this.GridView1.DataSource = b;
  20. GridView1.DataBind();
  21. }
  22. }
  23. }
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

[csharp] view plain copy print?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace BLL
  7. {
  8. using DAL;
  9. using Models;
  10. public class T_UserInfoBll
  11. {
  12. public List<T_UserInfo> QueryWhere(System.Linq.Expressions.Expression<Func<T_UserInfo, bool>> where)
  13. {
  14. T_UserInfoDal dal = new T_UserInfoDal();
  15. return dal.QueryWhere(where);
  16. }
  17. public bool AddData(T_UserInfo model)
  18. {
  19. T_UserInfoDal dal = new T_UserInfoDal();
  20. return dal.AddData(model);
  21. }
  22. }
  23. }
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

[csharp] view plain copy print?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace DAL
  7. {
  8. using Models;
  9. public class T_UserInfoDal
  10. {
  11. public List<T_UserInfo> QueryWhere(System.Linq.Expressions.Expression<Func<T_UserInfo, bool>> where)
  12. {
  13. BaseDbContext db = new BaseDbContext();
  14. return db.T_UserInfo.Where(where).ToList();
  15. }
  16. public bool AddData(T_UserInfo model)
  17. {
  18. BaseDbContext db = new BaseDbContext();
  19. db.T_UserInfo.Add(model);
  20. int isOK = db.SaveChanges(); //返回數據是:已寫入基礎數據庫的對象的數目。
  21. return isOK>0;
  22. }
  23. }
  24. }
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

[csharp] view plain copy print?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace Models
  7. {
  8. using System.ComponentModel.DataAnnotations;
  9. public class T_UserInfo
  10. {
  11. [Key] //因為這裏我們並沒有直接添加EF,所以意味著這裏沒有映射實體類的元數據了。所以這裏我們要手動的標註主鍵
  12. public int id { get; set; }
  13. public string Name { get; set; }
  14. public int Age { get; set; }
  15. }
  16. }
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 代碼先行