1. 程式人生 > >Restful.Data 開源持久層元件專案最新進展和使用說明

Restful.Data 開源持久層元件專案最新進展和使用說明

Restful.Data 經過 部落格園 和 CSDN 的宣傳,目前參與該專案的人數已達到 114 人(群號:338570336),雖大部分並不參與實際開發,但他們所提出的意見和建議以及在試用過程中發現的問題是非常寶貴的,在此對這幫兄弟的熱心參與表示感謝。

Restful.Data 群歡迎任何對技術交流感興趣的朋友加入,我們群擁有眾多熱心的技術達人,他們會幫你解答一切工作中所遇到的問題,我們共同期待你們的光臨,尤其是萌妹紙哦。

Restful.Data 目前已完成 MySql、Oracle 和 SqlServer 三種資料庫的 Provider 開發工作,意味著你可以使用 Restful.Data 操作這三種資料庫。

Restful.Data 最新 NuGet 包已經發布,可以在 NuGet 管理器上搜索 Restful.Data 下載最新版本試用。NuGet 地址:https://www.nuget.org/packages/Restful.Data/

有很多朋友詢問有沒有完整的使用文件,下面我分不同的場景來描述具體如何使用。

1、連線字串配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <clear/>
    <add name="
MySql" connectionString="server=192.168.1.101;database=Restful;user id=linli8;password=linli8" providerName="Restful.Data.MySql"/> <add name="SqlServer" connectionString="" providerName="Restful.Data.SqlServer"/> <add name="Oracle" connectionString="Data Source=linli8;User ID=linli8;Password=linli8
" providerName="Restful.Data.Oracle"/> </connectionStrings> </configuration>

2、註冊驅動程式工廠

// MySql
SessionProviderFactories.Register<MySqlSessionProviderFactory>();

// SqlServer
// SessionProviderFactories.Register<SqlServerSessionProviderFactory>();

// Oracle
// SessionProviderFactories.Register<OracleSessionProviderFactory>();

3、設定預設資料庫連線

SessionFactory.Default = "MySql";

此設定並非必須,如果在配置檔案中配置了多個數據庫連線,可通過此設定來告知 CreateDefaultSession 選擇使用哪個資料庫連線。

3、不帶引數的查詢操作

using( ISession session = SessionFactory.CreateDefaultSession() )
            {
                string sql = "select count(*) from Person";

                int count = session.ExecuteScalar<int>( sql );

                sql = "select * from Person";

                IDataReader reader = session.ExecuteDataReader( sql );

                DataTable dt = session.ExecuteDataTable( sql );

                DataSet ds = session.ExecuteDataSet( sql );
            }

4、匿名引數查詢和增刪改操作

using( ISession session = SessionFactory.CreateDefaultSession() )
            {
                string sql = "select count(*) from Person where Name = ? and CreateTime < ?";

                int count = session.ExecuteScalar<int>( sql, 1, DateTime.Now );

                sql = "select * from Person where Name = ? and CreateTime < ?";

                IDataReader reader = session.ExecuteDataReader( sql, 1, DateTime.Now );

                DataTable dt = session.ExecuteDataTable( sql, 1, DateTime.Now );

                DataSet ds = session.ExecuteDataSet( sql, 1, DateTime.Now );

                sql = "insert into Person( Name, CreateTime ) values ( ?, ? )";

                int i = session.Insert( sql, "testname", DateTime.Now );
            }

5、命名引數查詢和增刪改操作

using( ISession session = SessionFactory.CreateDefaultSession() )
            {
                IDictionary<string,object> parameters = new Dictionary<string,object>();

                parameters.Add( "@Name", "testname" );
                parameters.Add( "@CreateTime", DateTime.Now );

                string sql = "select count(*) from Person where Name = @Name and CreateTime < @CreateTime";

                int count = session.ExecuteScalar<int>( sql, parameters );

                sql = "select * from Person where Name = @Name and CreateTime < @CreateTime";

                IDataReader reader = session.ExecuteDataReader( sql, parameters );

                DataTable dt = session.ExecuteDataTable( sql, parameters );

                DataSet ds = session.ExecuteDataSet( sql, parameters );

                sql = "insert into Person( Name, CreateTime ) values ( @Name, @CreateTime )";

                int i = session.Insert( sql, parameters );
            }

6、分頁查詢

using( ISession session = SessionFactory.CreateDefaultSession() )
            {
                string sql = "select count(*) from Person";

                DataPage dp = session.ExecuteDataPage( sql, 1, 20, "CreateTime DESC" );

                DataTable dt = dp.Data;
            }

上面所提到的引數查詢方式對分頁查詢均適用。

7、儲存過程呼叫

using( ISession session = SessionFactory.CreateDefaultSession() )
            {
                CommandParameter parameter1 = new CommandParameter();

                parameter1.Direction = ParameterDirection.Input;
                parameter1.ParameterName = "@Name";
                parameter1.Size = 20;
                parameter1.Value = "testname";

                CommandParameter parameter2 = new CommandParameter();

                parameter2.Direction = ParameterDirection.Input;
                parameter2.ParameterName = "@CreateTime";
                parameter2.Size = 20;
                parameter2.Value = DateTime.Now;

                session.ExecuteStoredProcedure( 
                    "storedProcedureName", 
                    new List<CommandParameter>(){ parameter1, parameter2 } 
                );
            }

8、事務處理

using( ISession session = SessionFactory.CreateDefaultSession() )
            {
                using( DbTransaction transaction = session.BeginTransaction() )
                {
                    // ...
                    transaction.Commit();
                }
            }

9、LINQ 查詢

using( ISession session = SessionFactory.CreateDefaultSession() )
            {
                var queryable = session.Find<Person>()
                    .Where( s => s.Id == 1 )
                    .Where( s => s.Name.Contains( "test" ) )
                    .OrderBy( s => s.CreateTime )
                    .OrderBy( s => s.Name )
                    .Skip( 0 ).Take( 1 )
                    .Select( s => new { Name = s.Name, CreateTime = s.CreateTime } );

                // 斷言
                Assert.AreEqual( 1, queryable.Count() );

                // 列印 SQL
                Console.WriteLine( session.Provider.ExecutedCommandBuilder );
            }

10、實體新增

// 新增和更新時,物件務必使用 EntityHelper 建立實體代理,否則無法跟蹤屬性變化
            var person = EntityHelper.CreateProxy<Person>();

            person.Name = "test";
            //person.Age = 20;
            person.Money = 100;
            person.CreateTime = DateTime.Now;
            person.IsActive = false;

            using( ISession session = SessionFactory.CreateDefaultSession() )
            {
                // 直接插入實體
                int i = session.Insert( person );

                // 輸出生成的SQL語句
                Console.WriteLine( session.Provider.ExecutedCommandBuilder );

                int id = session.GetIndentifer<int>();// Lambda 表示式插入
                i = session.Insert<Person>()
                    .Set( s => s.Name, "test" )
                    .Set( s => s.Age, 20 )
                    .Set( s => s.Money, 200 )
                    .Set( s => s.CreateTime, DateTime.Now )
                    .Set( s => s.IsActive, true )
                    .Execute();

                // 輸出生成的SQL語句
                Console.WriteLine( session.Provider.ExecutedCommandBuilder );
            }

11、實體更新

using( ISession session = SessionFactory.CreateDefaultSession() )
            {
                // Find 方法返回的物件都是原始物件而非代理物件
                var person = session.Find<Person>().Where( s => s.Id == 1 ).Single();

                Console.WriteLine( session.Provider.ExecutedCommandBuilder );

                // 根據原始物件建立代理物件
                person = person.ToEntityProxy();

                person.Name = "test01";
                person.Age = 31;
                person.Money = 200;

                // 直接更新實體代理
                int i = session.Update( person );

                Console.WriteLine( session.Provider.ExecutedCommandBuilder );

                person = session.Find<Person>().Where( s => s.Id == 2 ).Single();

                Console.WriteLine( session.Provider.ExecutedCommandBuilder );

                person = EntityHelper.CreateProxy<Person>();

                person.Name = "test02";
                person.Age = 22;
                person.Money = 101;
                person.CreateTime = DateTime.Now;
                person.IsActive = false;

                // 使用 Lambda 表示式設定 where 條件
                i = session.Update<Person>()
                    .Set( person )
                    .Where( s => s.Id == id )
                    .Execute();

                Console.WriteLine( session.Provider.ExecutedCommandBuilder );

                person = session.Find<Person>().Where( s => s.Id == 3 ).Single();

                // 使用 Lambda 表示式設定 更新欄位 和 where 條件
                i = session.Update<Person>().Set( s => s.Name, "test03" )
                    .Set( s => s.Age, 23 )
                    .Set( s => s.Money, 102 )
                    .Set( s => s.CreateTime, DateTime.Now )
                    .Set( s => s.IsActive, true )
                    .Where( s => s.Id == 3 )
                    .Execute();

                Console.WriteLine( session.Provider.ExecutedCommandBuilder );
            }

12、實體刪除

using( ISession session = SessionFactory.CreateDefaultSession() )
            {
                var person = session.Find<Person>().Where( s => s.Id == 1 ).Single();

                // 直接刪除實體
                int i = session.Delete( person );

                Console.WriteLine( session.Provider.ExecutedCommandBuilder );

                // 使用 Lambda 表示式設定 where 條件
                i = session.Delete<Person>().Where( s => s.Id == 1 ).Execute();

                Console.WriteLine( session.Provider.ExecutedCommandBuilder );
            }