方便以后直接调用。

using System;
using System.Configuration;
using System.Reflection;
using DevExpress.Xpo;
using DevExpress.Xpo.DB;

namespace XpoHelper
{
    
public static class XpoInitializer
    {
        
/// <summary>
        
/// 调用XPO更新数据库结构。
        
/// 需要在具有相应权限的数据库帐户下运行。
        
/// </summary>
        
/// <param name="assemblies">整个项目中所有包含了XPO持久类的程序集。如:typeof(LibraryA.ClassA).Assembly, typeof(LibraryB.ClassB).Assembly...</param>
        public static void UpdateDatabaseSchema(params Assembly[] assemblies)
        {
            
string conn = GetConnectionString();
            IDataLayer datalayer 
= XpoDefault.GetDataLayer(conn, AutoCreateOption.DatabaseAndSchema);
            
using (Session session = new Session(datalayer))
            {
                session.UpdateSchema(assemblies);
                session.CreateObjectTypeRecords(assemblies);
            }
        }

        
/// <summary>
        
/// 根据配置文件创建并返回一个线程安全的XpoDataLayer。
        
/// 用在有多线程并发访问的场合,如ASP.NET项目。
        
/// 此方法同时会将该DataLayer指定给XpoDefault.DataLayer。
        
/// 并且将XpoDefault.Session置空。
        
/// </summary>
        
/// <param name="assemblies">整个项目中所有包含了XPO持久类的程序集。如:typeof(LibraryA.ClassA).Assembly, typeof(LibraryB.ClassB).Assembly...</param>
        
/// <returns>创建完成的ThreadSafeDataLayer</returns>
        public static ThreadSafeDataLayer CreateThreadSafeDataLayer(params Assembly[] assemblies)
        {
            
string conn = GetConnectionString();

            DevExpress.Xpo.Metadata.XPDictionary dict 
= new DevExpress.Xpo.Metadata.ReflectionDictionary();

            IDataStore store 
= XpoDefault.GetConnectionProvider(conn, AutoCreateOption.SchemaAlreadyExists);

            dict.GetDataStoreSchema(assemblies);

            ThreadSafeDataLayer datalayer 
= new ThreadSafeDataLayer(dict, store);

            XpoDefault.DataLayer 
= datalayer;

            XpoDefault.Session 
= null;

            
return datalayer;
        }

        
/// <summary>
        
/// 尝试根据配置文件中在appSettings节下指定的设置构造数据库连接字符串。
        
/// 若失败则尝试获取connectionStrings节下指定的第一个连接字符串。
        
/// </summary>
        
/// <returns>构造或获取到的数据库连接字符串</returns>
        public static string GetConnectionString()
        {
            
try
            {
                AppSettingsReader config 
= new AppSettingsReader();
                
string serverType, server, database, user, password;
                serverType 
= ((string)(config.GetValue("ServerType"typeof(string))));
                server 
= ((string)(config.GetValue("Server"typeof(string))));
                database 
= ((string)(config.GetValue("Database"typeof(string))));
                user 
= ((string)(config.GetValue("User"typeof(string))));
                password 
= ((string)(config.GetValue("Password"typeof(string))));
                
switch (serverType.ToUpper())
                {
                    
case "ACCESS":
                        
return AccessConnectionProvider.GetConnectionString(database, user, password);
                    
case "MSSQL":
                        
return MSSqlConnectionProvider.GetConnectionString(server, user, password, database);
                    
case "MYSQL":
                        
return MySqlConnectionProvider.GetConnectionString(server, user, password, database);
                    
case "ORACLE":
                        
return OracleConnectionProvider.GetConnectionString(server, user, password);
                    
// ... generate connection strings for other providers, e.g. Firebird, etc.
                    default:
                        
return ConfigurationManager.ConnectionStrings[0].ToString();
                }
            }
            
catch
            {
                
return ConfigurationManager.ConnectionStrings[0].ToString();
            }
        }
    }
}

相关文章: