连接到数据存储

连接到数据存储

  • 2020年9月30日
  • 9分钟阅读

先决条件

要将XPO与数据库服务器一起使用,请将所需的数据库提供程序程序集添加到项目的引用中。有关详细信息,请参见XPO支持数据库系统文档。

指定连接设置

调用GetDataLayer(String,AutoCreateOption)方法,并将连接字符串或现有连接对象作为参数传递给此方法。此方法创建一个数据访问层(DAL)对象。

使用新创建的DAL创建UnitOfWorkSession对象:

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,请使用无参数构造函数创建UnitOfWorkSession对象:

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) { }
    }
}
小费

您还可以通过以下方式指定连接字符串:

请参阅属性描述以获取更多信息。

建立连接

在以下情况下,将建立到数据存储的连接:

如果使用XpoDefault.GetDataLayerXpoDefault.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);
}

如果使用ConnectionStringConnection属性,则在会话处于活动状态时,连接仍处于活动状态(直到显式调用Session.Disconnect方法)。处置Session对象时,将隐式调用此方法。

这个怎么运作

img

数据存储提供商

数据存储提供程序是IDataStore的实现,并提供与各个数据存储(Microsoft SQL ServerMySQL数据库等)的连接。

另请参阅:DataStoreBase

资料存取层

数据访问层DAL)(一个IDataLayer实现),可数据存储统一的访问(从数据存储加载数据,更新它的数据和模式)通过对象访问层。

简单数据层和线程安全数据层

XPO提供以下数据访问层实现:

通常,SimpleDataLayer等于ThreadSafeDataLayer,并且用一个组件替换另一个组件无效。但是,在以下描述的情况下,您不能使用SimpleDataLayerThreadSafeDataLayer

  • SimpleDataLayer不支持从多个线程进行并发访问。在多线程应用程序和Web应用程序中使用ThreadSafeDataLayer,在多线程应用程序和Web应用程序中,多个用户之间共享数据访问层。如果使用XPInstantFeedbackSourceXPInstantFeedbackView数据源,请使用ThreadSafeDataLayer
  • ThreadSafeDataLayer意味着您永远不要在运行时向XPDictionary添加新类或修改XPO元数据。在创建ThreadSafeDataLayer之前,应将所有必需的类添加到XPDictionary中。在实例化ThreadSafeDataLayer对象之后,将无法动态创建新的类/属性或添加属性。
  • ThreadSafeDataLayer不支持显式事务
共享DAL以优化性能

当即将建立与数据存储的连接时,每个SessionUnitOfWork对象都会创建一个新的DAL。您可以强制SessionUnitOfWork使用现有的DAL。在这种情况下,将省略特定的初始化步骤,并且可以更快地建立连接。

要使会话使用特定的DAL,请执行以下一项操作:

另请参见:IDataLayerAsync

对象访问层

一个对象的访问层OAL)是一个之间的中介会话的UnitOfWork数据访问层。OAL将对象查询和存储模式更新转换为相应的语句,并将它们传递到数据访问层以执行。

XPO具有以下对象访问层实现。

另请参见:IObjectLayerAsync

概念

注意

ta-via-rest-api)

注意

您可以尝试的功能在这里描述的连接到数据存储的部分XPO教程演示(C:\用户\公用\文档\开发快速演示20. 2 \组件\赢形式\ BIN \ Xpo博览会教程。exe文件)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值