ORM組件 ELinq (一)首航之旅


      上一篇 年度開源力作,國產Linq ORM又一框架誕生了,這篇就開始首航之旅

  一: 開始ELinq 之旅

    這個教程演示了如何在微軟開發環境里搭建一個ELinq例子. 使用了以下工具:

  1. 控制台應用程序.

  2. Access 2007 Northwind 數據庫, ELinq也支持其他數據庫,更換數據庫要做的僅僅是在配置文件里更改數據庫方言和數據庫驅動。

  3. Visual Studio .NET 2010- 開發環境.

  4. SDK4.0 (當然也支持3.5)
  5. Nuget 包管理器備注:Nuget安裝方法和步驟:  http://docs.nuget.org/docs/start-here/installing-nuget

       Nuget使用說明:  http://docs.nuget.org/docs/start-here/using-the-package-manager-console

    1. 我們創建一個控制台項目.項目命名為QuickStart。 打開項目,添加ELinq.dll引用。

    2. 通過Nuget添加ELinq 的引用:在Nuget控制台中輸入:install-package ELinq, Nuget會自動的將你引用的庫的這個庫的依賴文件添加到你的項目引用中.

    3. 配置數據庫連接信息。添加App.Config 文件,並添加如下的配置信息

   

  <connectionStrings>
    <clear/>
    <add providerName ="System.Data.OleDb" name="Northwind" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Northwind.mdb;Persist Security Info=True"/>
  </connectionStrings>

       providerName:用來指示DbProviderFactory的標志類型,通過它來加載DbProviderFactory,下面我枚舉一下常用的providerName

  •  OleDb        :System.Data.OleDb
  •  Odbc         :System.Data.Odbc
  •  SqlServer   :System.Data.SqlClient
  •  SQLite       :System.Data.SQLite
  •  SqlCe35     : System.Data.SqlServerCe.3.5
  •  SqlCe40     : System.Data.SqlServerCe.4.0
  •  MySQL       : MySql.Data.MySqlClient
  • Oracle         : System.Data.OracleClient
  • Oracle_ODP : Oracle.DataAccess.Client

       name: 用來標志是哪一個連接字符串,如果項目中需要多個數據庫,那么可以添加多個連接字符串配置,這些配置通過name來區別,從而達到支持多數據庫的目的

       connectionString:存儲連接字符串的內容

   二:數據表Customers

 

 

 三:實體類 

 

    public class Customer
    {
        public string CustomerID;
        public string ContactName;
        public string CompanyName;
        public string Phone;
        public string City;
        public string Country;
    }

 

 四:映射Customers表

     首先添加:using NLite.Data;

     然后修正第三步的Customer實體類如下:

   [Table(Name = "Customers")]
    public class Customer
    {
        [Id]
        public string CustomerID;
        [Column]
        public string ContactName;
        [Column]
        public string CompanyName;
        [Column]
        public string Phone;
        [Column]
        public string City;
        [Column]
        public string Country;
    }

 五:與Customer同舞

       1. 創建DbConfiguration

   DbConfiguration在ELinq里面是一個單個數據存儲的概念(在SQLServer里面就是對應一個database),多數據庫操作可以使用創建多個連接字符串配置以及在程序里創建多個DbConfiguration對象來實現。

 var dbConfiguration = DbConfiguration.Configure("Northwind");

    DbConfiguration代表一個數據庫。 NLite.Data通過對DbConfiguration().Configure(connectionStringName)的調用來初始化DbConfiguration實例。通過DbConfiguration實例創建一個IDbContext。 在創建 IDbContext之前,你可以訪問Configuration來設置其他屬性(甚至修改映射的元數據)。 我們應該在哪兒創建DbConfiguration,在我們的程序中又如何訪問它呢?

 DbConfiguration通常只是被初始化一次,比如說在Application_Start事件里來初始化。 這意味着你不應該在ASP.NET頁面中把它作為一個實例變量來持有,而應該放在其他地方。進一步的說, 我們需要使用單例(Singleton)模式,我們才能更容易的在程序中訪問 DbConfiguration。

 

     2. 注冊OR映射

     經過了實體類Customer和數據表Customers的映射,現在需要把它們的映射關系注冊到DbConfiguration對象中,這樣就可以使用IDbSet操作了。

 dbConfiguration.AddClass<QuickStart.First.Customer>();

 

    3. 為了方便跟蹤Sql輸出,注冊控制台日志

dbConfiguration.SetSqlLogger(() => new SqlLog(Console.Out));

    4. 創建IDbContext

     DbContext 里面封裝了數據庫連接對象,代表一個連接對象,使用完畢后要注意及時釋放

 using (var ctx = dbConfiguration.CreateDbContext())
 {
 }

  5. 創建IDbSet 玩轉Linq

 var q= ctx.Set<QuickStart.First.Customer>();

    1): 添加一條記錄

 var c = new Customer
 {
      CustomerID = "XX1",
      CompanyName = "Company1",
      ContactName = "Contact1",
      City = "Seattle",
      Country = "USA"
   };
   // 執行PO插入
   q.Insert(c);

      控制台輸出的SQL信息如下:

INSERT INTO [Customers]([CustomerID], [ContactName], [CompanyName], [Phone], [City], [Country])
VALUES (p0, p1, p2, p3, p4, p5)
-- p0:(DbType = String,Value = XX1)
-- p1:(DbType = String,Value = Contact1)
-- p2:(DbType = String,Value = Company1)
-- p3:(DbType = String,Value = NULL)
-- p4:(DbType = String,Value = Seattle)
-- p5:(DbType = String,Value = USA)

  2):通過主鍵查詢

 var c2 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
 Console.WriteLine(c2.CustomerID);

  控制台輸出的SQL信息如下:

SELECT TOP 1 t0.[CustomerID], t0.[ContactName], t0.[CompanyName], t0.[Phone], t0.[City], t0.[Country]
FROM [Customers] AS t0
WHERE (t0.[CustomerID] = p0)
-- p0:(DbType = String,Value = XX1)

XX1

   3): 基於Linq的局部更新

  //基於Linq的局部更新
 q.Update(new { CompanyName = "ddd" }, p => p.CustomerID == c.CustomerID);

  //查詢
  var c3 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
  Console.WriteLine(c3.CompanyName);

     控制台輸出的SQL信息如下:

UPDATE [Customers]
SET [CompanyName] = p1
WHERE ([CustomerID] = p0)
-- p0:(DbType = String,Value = XX1)
-- p1:(DbType = String,Value = ddd)

SELECT TOP 1 t0.[CustomerID], t0.[ContactName], t0.[CompanyName], t0.[Phone], t0.[City], t0.[Country]
FROM [Customers] AS t0
WHERE (t0.[CustomerID] = p0)
-- p0:(DbType = String,Value = XX1)

ddd

     4:) 基於Linq的刪除

 //基於Linq的刪除
 q.Delete(p => p.CustomerID == c.CustomerID);

  var c4 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
  if (c4 != null)
      Console.WriteLine("Delete failed");

   控制台輸出的SQL信息如下:

DELETE FROM [Customers]
WHERE ([CustomerID] = p0)
-- p0:(DbType = String,Value = XX1)

SELECT TOP 1 t0.[CustomerID], t0.[ContactName], t0.[CompanyName], t0.[Phone], t0.[City], t0.[Country]
FROM [Customers] AS t0
WHERE (t0.[CustomerID] = p0)
-- p0:(DbType = String,Value = XX1)

   六:全部代碼

       public static void Main(params string[] args)
        {
            var dbConfiguration = DbConfiguration.Configure("Northwind");

            dbConfiguration.AddClass<QuickStart.First.Customer>();

            dbConfiguration.SetSqlLogger(() => new SqlLog(Console.Out));

            using (var ctx = dbConfiguration.CreateDbContext())
            {
                var q = ctx.Set<QuickStart.First.Customer>();
                var c = new Customer
                {
                    CustomerID = "XX1",
                    CompanyName = "Company1",
                    ContactName = "Contact1",
                    City = "Seattle",
                    Country = "USA"
                };
                // 執行PO插入
                q.Insert(c);

                //查詢
                var c2 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
                Console.WriteLine(c2.CustomerID);

                //基於Linq的局部更新
                q.Update(new { CompanyName = "ddd" }, p => p.CustomerID == c.CustomerID);

                //查詢
                var c3 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
                Console.WriteLine(c3.CompanyName);

                //基於Linq的刪除
                q.Delete(p => p.CustomerID == c.CustomerID);

                var c4 = q.FirstOrDefault(p => p.CustomerID == c.CustomerID);
                if (c4 != null)
                    Console.WriteLine("Delete failed");
            }

            Console.Read();
        }

   七:總結

  在這個短小的教程中,我們對ELinq的淺嘗即止。ELinq作為一個數據庫訪問層,是與你的程序緊密相關的。 通常情況下,所有其他層次都依賴持久機制。

     最后附上Demo代碼:http://files.cnblogs.com/netcasewqs/QuickStart.zip

技術支持:

  1. 官方網站
  2. Nuge 下載頁面
  3. ORM組件 ELinq系列
  4. ORM組件 ELinq 更新日志
  5. ORM組件 ELinq 使用答疑
  6. 在我的博客留言,我會盡可能地抽時間來答復大家的問題。
  7. 加入 ELinq用戶的 QQ群(271342583)。

   謝謝大家的閱讀,麻煩大伙點一下推薦,再次謝謝大家。 ^_^


免責聲明!

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



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