连接到数据存储
- 2020年9月30日
- 9分钟阅读
#先决条件
要将XPO与数据库服务器一起使用,请将所需的数据库提供程序程序集添加到项目的引用中。有关详细信息,请参见XPO支持的数据库系统文档。
#指定连接设置
调用GetDataLayer(String,AutoCreateOption)方法,并将连接字符串或现有连接对象作为参数传递给此方法。此方法创建一个数据访问层(DAL)对象。
使用新创建的DAL创建UnitOfWork或Session对象:
using System;
using System.Linq;
using DevExpress.Xpo;
namespace XpoConsoleApp {
class Program {
static void Main(string[] args) {
// Connect to an in-memory source
const string connectionString = @"XpoProvider=InMemoryDataStore;Data Source=.\mydatabase.xml;Read Only=false";
var inMemoryDAL = XpoDefault.GetDataLayer(connectionString, DevExpress.Xpo.DB.AutoCreateOption.DatabaseAndSchema);
// Create and save a new data object
using(var uow = new UnitOfWork(inMemoryDAL)) {
var contact = new Contact(uow);
contact.FirstName = "Alice";
contact.LastName = "Smith";
uow.CommitChanges();
}
// Read the new data object
using(var uow = new UnitOfWork(inMemoryDAL)) {
var contact = uow.Query<Contact>().FirstOrDefault(c => c.LastName == "Smith");
Console.WriteLine(contact.FirstName + " " + contact.LastName);
}
}
}
public class Contact : XPObject {
public string FirstName {
get { return fFirstName; }
set { SetPropertyValue(nameof(FirstName), ref fFirstName, value); }
}
string fFirstName;
public string LastName {
get { return fLastName; }
set { SetPropertyValue(nameof(LastName), ref fLastName, value); }
}
string fLastName;
public Contact(Session session) : base(session) { }
}
}
#共享连接-默认数据访问层
您可以创建一个默认的DAL,并在您的应用程序的任何范围内使用它。
使用XpoDefault.DataLayer静态属性来获取或设置默认数据层。
要使用默认DAL,请使用无参数构造函数创建UnitOfWork或Session对象:
using System;
using System.Linq;
using DevExpress.Xpo;
namespace XpoConsoleApp {
class Program {
static void Main(string[] args) {
// Connect to an in-memory source
const string connectionString = @"XpoProvider=InMemoryDataStore;Data Source=.\mydatabase.xml;Read Only=false";
XpoDefault.DataLayer = XpoDefault.GetDataLayer(connectionString, DevExpress.Xpo.DB.AutoCreateOption.DatabaseAndSchema);
// Create and save a new data object
// This Unit of Work uses a default Data Access Layer
using(var uow = new UnitOfWork()) {
var contact = new Contact(uow);
contact.FirstName = "Alice";
contact.LastName = "Smith";
uow.CommitChanges();
}
// Read a data object
// This Unit of Work uses a default Data Access Layer
using(var uow = new UnitOfWork()) {
var contact = uow.Query<Contact>().FirstOrDefault(c => c.LastName == "Smith");
Console.WriteLine(contact?.FirstName + " " + contact?.LastName);
}
}
}
public class Contact : XPObject {
// ...
public Contact(Session session) : base(session) { }
}
}
小费
您还可以通过以下方式指定连接字符串:
- 将连接字符串传递给Xpo Default。连接字符串属性。
- 创建一个新的会话或单位中工作,并通过一个连接字符串连接字符串属性。
请参阅属性描述以获取更多信息。
#建立连接
在以下情况下,将建立到数据存储的连接:
- 当您使用XpoDefault.GetDataLayer方法创建新的DAL或使用[XpoDefault.GetConnectionProvider](xref:DevExpress.Xpo.XpoDefault.GetConnectionProvider *方法创建连接提供程序时)。
- 当调用Connect()方法时(如果指定了ConnectionString或Connection);
- 之前保存或检索一个持久对象(如果ConnectionString的或连接被指定);
如果使用XpoDefault.GetDataLayer或XpoDefault.GetConnectionProvider方法,则XPO会保持连接打开状态,直到应用程序停止或重新启动为止。
要更改数据库连接而不重新启动应用程序,请使用以下重载方法:
- [GetDataLayer(String,XPDictionary,AutoCreateOption,out IDisposable ])
- [GetDataLayer(IDbConnection,XPDictionary,AutoCreateOption,out IDisposable ])
- [GetConnectionProvider(String,AutoCreateOption,IDisposable ])
这些方法还有一个额外的out参数,该参数使用IDisposable对象数组初始化变量objectsToDisposeOnDisconnect
。
using DevExpress.Xpo;
using DevExpress.Xpo.DB;
using DevExpress.Xpo.Metadata;
// ...
static IDisposable[] ObjectsToDisposeOnDisconnect;
static Lazy<XPDictionary> SharedDictionary = new Lazy<XPDictionary>(CreateSharedDictionary);
static void ChangeConnection(string connectionString) {
if(ObjectsToDisposeOnDisconnect != null) {
foreach(IDisposable toDispose in ObjectsToDisposeOnDisconnect)
toDispose.Dispose();
}
XpoDefault.DataLayer = XpoDefault.GetDataLayer(connectionString, SharedDictionary.Value, AutoCreateOption.SchemaAlreadyExists, out ObjectsToDisposeOnDisconnect);
}
static XPDictionary CreateSharedDictionary() {
XPDictionary result = new ReflectionDictionary();
result.GetDataStoreSchema(typeof(Contact).Assembly);
return result;
}
如果要控制连接状态(打开/关闭),请创建一个IDbConnection
对象,然后将其通过构造函数传递给Data Store Provider。
using DevExpress.Xpo;
using DevExpress.Xpo.DB;
using Microsoft.Data.SqlClient;
// ...
SqlConnection Connection;
void Connect(string connectionString) {
Connection = new SqlConnection(connectionString);
MSSqlConnectionProvider dataStoreProvider = new MSSqlConnectionProvider(Connection, AutoCreateOption.SchemaAlreadyExists);
XpoDefault.DataLayer = new SimpleDataLayer(dataStoreProvider);
}
如果使用ConnectionString或Connection属性,则在会话处于活动状态时,连接仍处于活动状态(直到显式调用Session.Disconnect方法)。处置Session对象时,将隐式调用此方法。
#这个怎么运作
#数据存储提供商
数据存储提供程序是IDataStore的实现,并提供与各个数据存储(Microsoft SQL Server,MySQL数据库等)的连接。
另请参阅:DataStoreBase。
#资料存取层
甲数据访问层(DAL)(一个IDataLayer实现),可数据存储统一的访问(从数据存储加载数据,更新它的数据和模式)通过对象访问层。
#简单数据层和线程安全数据层
XPO提供以下数据访问层实现:
通常,SimpleDataLayer等于ThreadSafeDataLayer,并且用一个组件替换另一个组件无效。但是,在以下描述的情况下,您不能使用SimpleDataLayer或ThreadSafeDataLayer:
- SimpleDataLayer不支持从多个线程进行并发访问。在多线程应用程序和Web应用程序中使用ThreadSafeDataLayer,在多线程应用程序和Web应用程序中,多个用户之间共享数据访问层。如果使用XPInstantFeedbackSource和XPInstantFeedbackView数据源,请使用ThreadSafeDataLayer。
- ThreadSafeDataLayer意味着您永远不要在运行时向XPDictionary添加新类或修改XPO元数据。在创建ThreadSafeDataLayer之前,应将所有必需的类添加到XPDictionary中。在实例化ThreadSafeDataLayer对象之后,将无法动态创建新的类/属性或添加属性。
- ThreadSafeDataLayer不支持显式事务。
#共享DAL以优化性能
当即将建立与数据存储的连接时,每个Session或UnitOfWork对象都会创建一个新的DAL。您可以强制Session或UnitOfWork使用现有的DAL。在这种情况下,将省略特定的初始化步骤,并且可以更快地建立连接。
要使会话使用特定的DAL,请执行以下一项操作:
- 将DAL分配给XpoDefault.DataLayer属性。DAL未初始化的所有新创建的会话均使用默认DAL。
- 将DAL传递给Session或UnitOfWork对象的构造函数。
- 将DAL传递到Session或UnitOfWork对象的Connect方法(有关详细信息,请参见Session.Connect)以建立与数据存储的连接。
另请参见:IDataLayerAsync。
#对象访问层
一个对象的访问层(OAL)是一个之间的中介会话或的UnitOfWork和数据访问层。OAL将对象查询和存储模式更新转换为相应的语句,并将它们传递到数据访问层以执行。
XPO具有以下对象访问层实现。
- SimpleObjectLayer-默认情况下为会话或工作单元创建。该对象层使用数据访问层作为数据源。
- SessionObjectLayer-默认为嵌套的工作单元创建。该对象层使用父工作单元作为数据源。
- SerializableObjectLayerClient-适用于使用WCF,.NET Remoting等传输数据的应用程序。该对象层使用SerializableObjectLayer类或将ISerializableObjectLayer接口实现为数据源的任何其他类。
另请参见:IObjectLayerAsync。
#概念
注意
ta-via-rest-api)
注意
您可以尝试的功能在这里描述的连接到数据存储的部分XPO教程演示(C:\用户\公用\文档\开发快速演示20. 2 \组件\赢形式\ BIN \ Xpo博览会教程。exe文件)。