static void Main() { // // XPOにて、共通の設定を行う為のクラスはXpoDefaultというクラスになる. // このクラスには、デフォルトデータレイヤやデフォルトセッションなどを保持している。 // // SessionやUnitOfWorkを作成する際に、コンストラクタにデータレイヤなどを // 明示的に渡さずに初期化した場合、XpoDefaultに設定されている内容が利用される。 // // 接続に関して、重要なのは以下の2つのプロパティ. // XpoDefault.DataLayer -- デフォルトデータレイヤ // XpoDefault.Session -- デフォルトセッション // // 何も設定していない場合、XPOではデフォルトでMSAccessデータベースが // 作成される。それは、XpoDefaultにて初期設定がそのようになっているからである。 // // アプリを作成する際に、特定のデータベースに接続する必要があるが // 以下の手順で行う。 // // (1) 各データベース用のConnectionProviderクラスから接続文字列を作成する。(ex:MSSqlCEConnectionProvider) // (2) XpoDefault.GetDataLayerメソッドに接続文字列を渡して、データレイヤを取得 // (3) XpoDefault.DataLayerに(2)で取得したデータレイヤを設定。これがデフォルトデータレイヤとなる。 // (4) XpoDefault.Sessionにnullを設定. // // (4)を行う事により、デフォルトセッションを利用できなくしている。(XPO Best Practice) // つまり、XPCollectionなどを利用する際に明示的にセッションを渡さないとエラーになるようにできる。 // デフォルトセッションを利用していると、たまに意図しない接続先に繋がっていることもあるので // 可能な限り利用しない方がよい。(デフォルトデータレイヤはオッケイ) // var connString = MSSqlCEConnectionProvider.GetConnectionString("SampleDB.sdf"); var dataLayer = XpoDefault.GetDataLayer(connString, AutoCreateOption.DatabaseAndSchema); XpoDefault.DataLayer = dataLayer; XpoDefault.Session = null; using (var uow = new UnitOfWork()) { for (int i = 0; i < 5; i++) { new Music(uow) { Title = string.Format("Title-{0}", i), ArtistName = string.Format("ArtistName-{0}", i) }; } uow.CommitChanges(); } using (var uow = new UnitOfWork()) { var query = from _ in uow.Query <Music>() select new { Title = _.Title, ArtistName = _.ArtistName }; foreach (var item in query) { Console.WriteLine(item); } } }
static void Main() { // // XPView // XpoDefault.DataLayer = XpoDefault.GetDataLayer(MSSqlCEConnectionProvider.GetConnectionString("XPOSample08.sdf"), AutoCreateOption.DatabaseAndSchema); XpoDefault.Session = null; }
/// <summary> /// Подключение к БД. /// </summary> private void Connect() { switch (DataBaseType) { case SQLType.Access: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( AccessConnectionProvider.GetConnectionString(DataBase, User, Password), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( AccessConnectionProvider.GetConnectionString(DataBase), AutoCreateOption); } break; case SQLType.Access2007: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( AccessConnectionProvider.GetConnectionStringACE(DataBase, Password), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( AccessConnectionProvider.GetConnectionStringACE(DataBase, ""), AutoCreateOption); } break; case SQLType.MSSql: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( MSSqlConnectionProvider.GetConnectionString(Server, User, Password, DataBase), AutoCreateOption); //string connctionString = string.Format(@"Data Source={0};Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=qwe+ASDFG", Server); //XpoDefault.DataLayer = XpoDefault.GetDataLayer(connctionString, AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( MSSqlConnectionProvider.GetConnectionString(Server, DataBase), AutoCreateOption); } break; case SQLType.MSSqlCE: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( MSSqlCEConnectionProvider.GetConnectionString(DataBase, Password), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( MSSqlCEConnectionProvider.GetConnectionString(DataBase), AutoCreateOption); } break; case SQLType.MySQL: XpoDefault.DataLayer = XpoDefault.GetDataLayer( MySqlConnectionProvider.GetConnectionString(Server, "", "", DataBase), AutoCreateOption); break; case SQLType.Oracle: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( OracleConnectionProvider.GetConnectionString(Server, User, Password), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( OracleConnectionProvider.GetConnectionString(Server, "", ""), AutoCreateOption); } break; case SQLType.Firebird: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( FirebirdConnectionProvider.GetConnectionString(Server, User, Password, DataBase), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( FirebirdConnectionProvider.GetConnectionString(Server, "", "", DataBase), AutoCreateOption); } break; case SQLType.PostgreSql: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( PostgreSqlConnectionProvider.GetConnectionString(Server, User, Password, DataBase), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( PostgreSqlConnectionProvider.GetConnectionString(Server, "", "", DataBase), AutoCreateOption); } break; case SQLType.SQLite: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( SQLiteConnectionProvider.GetConnectionString(DataBase, Password), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( SQLiteConnectionProvider.GetConnectionString(DataBase), AutoCreateOption); } break; case SQLType.VistaDB: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( VistaDBConnectionProvider.GetConnectionString(DataBase, Password), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( VistaDBConnectionProvider.GetConnectionString(DataBase), AutoCreateOption); } break; case SQLType.PervasiveSql: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( PervasiveSqlConnectionProvider.GetConnectionString(Server, User, Password, DataBase), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( PervasiveSqlConnectionProvider.GetConnectionString(Server, "", "", DataBase), AutoCreateOption); } break; case SQLType.DB2: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( DB2ConnectionProvider.GetConnectionString(Server, DataBase, User, Password), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( DB2ConnectionProvider.GetConnectionString(Server, DataBase, "", ""), AutoCreateOption); } break; case SQLType.NexusDB: if (PasswordNeed) { XpoDefault.DataLayer = XpoDefault.GetDataLayer( NexusDBConnectionProvider.GetConnectionString(Server, User, Password, DataBase), AutoCreateOption); } else { XpoDefault.DataLayer = XpoDefault.GetDataLayer( NexusDBConnectionProvider.GetConnectionString(Server, "", "", DataBase), AutoCreateOption); } break; default: XpoDefault.DataLayer = XpoDefault.GetDataLayer( AccessConnectionProvider.GetConnectionString(DataBase), AutoCreateOption.DatabaseAndSchema); break; } }
static void Main() { // // XPOには、NestedUnitOfWorkというクラスが存在する。 // このクラスは、文字通りネストしたUOWを示す。 //(サブトランザクションのようなイメージ) // // NestedUnitOfWork内でコミットされた変更は // 親のUOWにてコミットされない限り、確定しない。 // これは、別のUOWからは変更が見えないという意味であり // 親のUOWからはNestedUnitOfWorkの変更は見える。 // // 概念的には、DBのトランザクションやTransactionScopeと同じ。 // // 画面にて別画面を開いて、データを編集してまた戻ってくる場合などに利用できる。 // (Tutorial 4はそのパターンを実装してくれている。) // // NestedUnitOfWork内では、オブジェクトを親のUOWと明確に分けて取得することが出来る。 // ・GetNestedObject // また、NestedUnitOfWork内で親側のUOWからオブジェクトを取得することも出来る。 // ・GetParentObject // // [参考リソース] // http://documentation.devexpress.com/#XPO/CustomDocument2260 // http://documentation.devexpress.com/#XPO/CustomDocument2113 // XpoDefault.DataLayer = XpoDefault.GetDataLayer(MSSqlCEConnectionProvider.GetConnectionString("XPOSample07.sdf"), AutoCreateOption.DatabaseAndSchema); XpoDefault.Session = null; // // 初期データ生成. // using (var uow = new UnitOfWork()) { uow.Delete(new XPCollection <Customer>(uow)); for (int i = 0; i < 10; i++) { new Customer(uow) { Name = string.Format("Customer-[{0}]", i), Age = i + 30 }; } uow.CommitChanges(); } // // NestedUnitOfWorkを作成して親UOWがコミットしていない状態での値を確認. // var criteria = CriteriaOperator.Parse("Age = 33"); using (var uow = new UnitOfWork()) { using (var nuow = uow.BeginNestedUnitOfWork()) { var nuowCustomer = nuow.FindObject <Customer>(criteria); nuowCustomer.Name = "Modified"; nuow.CommitChanges(); } var theCustomer = uow.FindObject <Customer>(criteria); Console.WriteLine(theCustomer.Name); // // わざと親のUOWではCommitChangesを呼ばずに処理終了. // // 以下のコメントを外すと、変更が確定され、別のUOWでも変更が見えるようになる. //uow.CommitChanges(); } // // 別のUOWで再度同じ条件を指定して値を確認. // using (var uow = new UnitOfWork()) { var theCustomer = uow.FindObject <Customer>(criteria); Console.WriteLine(theCustomer.Name); } using (var uow = new UnitOfWork()) { var parentCustomer = uow.FindObject <Customer>(criteria); using (var nuow = uow.BeginNestedUnitOfWork()) { var nestedCustomer = nuow.GetNestedObject <Customer>(parentCustomer); nestedCustomer.Name = "Modified 2"; nuow.CommitChanges(); } // // NestedUnitOfWork側でコミット(つまり子のトランザクション)を行う事により // 親側のオブジェクトの値も変更状態となる。 // しかし、この変更は親側のトランザクションにて未コミットとなっているので // リロードするか、そのままUOWをコミットせずに終了することにより変更が破棄される。 // // 強制的に親オブジェクトの値を元に戻すには、リロード処理を行う必要がある。 // Session.Reload, Session.DropIdentityMap // もしくは、再度同じ条件でオブジェクトを取得し直す. // Console.WriteLine(parentCustomer.Name); uow.Reload(parentCustomer); Console.WriteLine(parentCustomer.Name); Console.WriteLine(uow.FindObject <Customer>(criteria).Name); } // // 別のUOWで再度同じ条件を指定して値を確認. // using (var uow = new UnitOfWork()) { var theCustomer = uow.FindObject <Customer>(criteria); Console.WriteLine(theCustomer.Name); } }