[ORM] Entity Framework(1) CodeFirst快速入門


    Entity Framework 是微軟以 ADO.NET 為基礎所發展出來的對象關系對應 (O/R Mapping) 解決方案
    對象關系映射(英語:Object Relational Mapping,簡稱ORM),是一種程序技術,用於實現面向對象編程語言里不同類型系統的數據之間的轉換。

 

    下載:Install-Package EntityFramework -Version 6.1.3  (7.0只有CodeOnly模式)

    本節技術概覽:數據庫的安裝DB First,Model FirstCode First(重點)DbContext,DbSetCRUD例子數據遷移以及事務管理

 

LocalDB和SQL Server安裝

  LocalDb是visual studio自帶的,用來開發使用。運行是采用進程形式而非服務形式。

  位置:C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SqlLocalDB.exe(這是vs 2013的位置,使用VS2013開發人員工具輸入sqllocaldb即可)

  SQL Server采用服務方式,方便連接管理。可以去itellyou.cn下載。

連接

  可以直接用vs連接這2種數據庫。連接localdb

 

 

DB First,Model First

  

DB First采用通常的數據庫先行的辦法,常見,穩定。基本下一步下一步就能完成。

Model First在VS中 畫模型圖,來生成數據庫和Object,不方便控制數據庫。

這2個都會產生edmx文件(xml),包含SSDL(數據定義),CSDL(類定義),CS Mapping(數據類映射)

在edmx模型查看中,不會把所有表都顯示。當2個表的關系為多對多的時候,關系表會由一條多對多的線來表示。

在Model Browser中,可以看到存儲過程,視圖等非表的信息。

 

CodeFirst

  在EF7中,只有Code Only 說明Code First的重要性。在使用中,中小型項目,我也推薦使用,畢竟開發效率提高了不止一點點。

 

創建POCO

    public class App
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<AppData> AppDatas { get; set; }
    }

    public class AppData
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Value { get; set; }
        public virtual App App { get; set; }
    }

 創建DbContext

    public class AppContext : DbContext
    {
        public AppContext()
            : base("AppDb")           //AppDb數據庫庫名
        {
            
        }
        public DbSet<App> Apps { get; set; }
        public DbSet<AppData> AppDatas { get; set; }
    }

文件結構:

app.config

<configuration>
  <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=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
App.Config

 

Main方法

        static void Main(string[] args)
        {
            using (var ctx = new AppContext())
            {
                var app = new App() { Name = "博客園" };
                var data = new[]
                {
                    new AppData() {Name = "最新博客", Value = "XX", App = app},
                    new AppData() {Name = "48小時閱讀排行", Value = "YY", App = app}
                };
                ctx.Apps.Add(app);
                ctx.AppDatas.AddRange(data);
                ctx.SaveChanges();
            }
        }

連接數據庫,查看數據庫。

        

 

DbContext,DbSet

  在EF中,DbContext相當於一個數據庫,DbSet則相當於一個數據表或者視圖。

 

 

數據遷移

當業務改變,POCO類需要改變,表也需要改變。

EF的數據遷移通過 NuGet 來進行。

打開程序包管理器控制台(Package Manager Console),鍵入“get-help EntityFramework”命令,可以獲得相關的幫助信息。

Enable-Migrations [-Force]

Add-Migration

Update-Database

Get-Migrations

 

 

如:加一個Title屬性

    public class App
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Title { get; set; }  //add prop  
        public virtual ICollection<AppData> AppDatas { get; set; }
    }

 

啟動遷移功能

文件結構

 

生成改變

 

如果覺得太麻煩,可以使用以下方式

    public class AppContext : DbContext
    {
        public AppContext()
            : base("AppDb")           //AppDb數據庫庫名,也可以換成連接字符串
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<AppContext>());
        }
        public DbSet<App> Apps { get; set; }
        public DbSet<AppData> AppDatas { get; set; }
    }

 

 CRUD例子:

            using (var ctx = new AppContext())
            {
                //crud
                #region create
                var app = new App() { Name = "博客園" };
                var data = new[]
                {
                    new AppData() {Name = "最新博客", Value = "XX", App = app},
                    new AppData() {Name = "48小時閱讀排行", Value = "YY", App = app}
                };
                ctx.Apps.Add(app);
                ctx.AppDatas.AddRange(data);
                ctx.SaveChanges();
                #endregion

                #region update
                app.Name = "Never、C";
                ctx.SaveChanges();
                //or
                ctx.Apps.AddOrUpdate(app);
                #endregion

                #region read
                app = ctx.Apps.FirstOrDefault(o => o.Name == "博客園");
                Console.WriteLine(app);
                #endregion

                #region delete
                ctx.Apps.Remove(app);
                #endregion
            }
EF CRUD




事務管理

對於一個ORM框架,支持事務操作是必須的。

我們的每一次SaveChanges就是一個事務操作,只需要在所有更改都完成后,調用這個方法就可以了。

如果你不願意,可以手動的開啟事務的代碼 :

DbConnection con = ((IObjectContextAdapter)ctx).ObjectContext.Connection;
con.Open();
using (var tran = con.BeginTransaction())
{
  // 這里才是事務中的代碼

   tran.Commit();
}
con.Close();

 

以上是針對一個DbContext,也就是一個數據庫的時候,如果操作涉及到多個數據庫,還是使用分布式事務操作比較靠譜。

使用分布式事務處理,需要Windows系統的支持,所以,我們需要將系統的MSDTC服務開啟。

 

代碼下載:EFTest.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM