上下文提供程序
在Obase中,对象上下文提供程序是核心组件之一,它为开发者提供了与特定数据库交互的强大功能。这个提供程序不仅能让开发者能够自定义如何使用各种数据库,还允许根据实际需求进行深度定制。通过对象上下文提供程序,开发者可以更加灵活地应对各种数据库操作场景,从而提升开发效率和应用程序的性能。
ContextConfigProvider
在Obase中,对象上下文提供程序指的是ContextConfigProvider,它是一个针对特定功能的上下文配置提供程序。该提供程序定义了如何配置对象上下文,以使其能够与数据库进行交互。 ContextConfigProvider的定义如下:
//特定于功能的上下文配置提供程序。
public abstract class ContextConfigProvider
{
// 获取一个值,该值指示是否自动创建对象集。
protected internal virtual bool WhetherCreateSet => true;
// 使用指定的建模器创建对象数据模型。
protected abstract void CreateModel(ModelBuilder modelBuilder);
//创建面向指定存储服务的存储结构映射提供程序。 实施说明 默认不执行任何操作,派生类可以重写此方法创建所需的提供程序。
protected virtual IStorageStructMappingProvider CreateStorageStructMappingProvider(StorageSymbol storageSymbol);
//由派生类实现,创建指定存储标记对应的存储提供程序。
protected abstract IStorageProvider CreateStorageProvider(StorageSymbol symbol, ObjectDataModel model);
// 获取用于发送对象变更通知的消息队列。:
// 如果要发送对象变更通知,返回一个消息队列实例;否则返回null。
protected internal virtual IMessageQueue GetNoticeQueue();
}
SqlContextConfigProvider
除了ContextConfigProvider,Obase还提供了SqlContextConfigProvider,这是专门用于SQL数据源的对象上下文配置提供程序。Obase官方提供的关系型数据库都从SqlContextConfigProvider继承,使其具有更多额外的定义和功能。SqlContextConfigProvider的实现如下:
//适用于SQL数据源的对象上下文配置提供程序。
public abstract class SqlContextConfigProvider : ContextConfigProvider
{
//由派生类实现,获取特定于数据库服务器(SQL Server、Oracle等)的数据提供程序工厂。
protected internal abstract DbProviderFactory DbProviderFactory { get; }
//由派生类实现,获取数据库连接字符串。
protected internal abstract string ConnectionString { get; }
//获取 数据源类型。
protected virtual eDataSource SourceType => (eDataSource)(-1);
//获取一个值,该值指示是否启用存储结构映射
protected virtual bool EnableStructMapping => false;
//日志工厂
protected virtual ILoggerFactory LoggerFactory => null;
}
基于SqlContextConfigProvider使用Sqlite
Obase提供了多种关系型数据库扩展包,如果这些扩展包无法满足特定需求,开发者可以自行继承SqlContextConfigProvider并实现所需功能。以下是一个以Sqlite数据库为例的示例:
// 适用于Sqlite数据源的对象上下文配置提供程序
public abstract class SqliteContextConfigProvider : SqlContextConfigProvider
{
//指定数据库驱动为Sqlite
protected override DbProviderFactory DbProviderFactory => SqliteFactory.Instance;
//指定数据库类型为Sqlite
protected override eDataSource SourceType => eDataSource.Sqlite;
}
通过继承SqlContextConfigProvider并重写DbProviderFactory和SourceType属性,开发者可以针对特定数据库进行定制化配置,以满足特定的业务需求。
自动生成表结构
Obase默认不会生成数据表,如需要自动生成,需要重写EnableStructMapping为True:
/// <summary>
/// 特定于MySql的对象上下文配置提供程序
/// </summary>
public class SqliteContextConfigProvider : SqlContextConfigProvider
{
/// <summary>
/// 自动生成表结构
/// </summary>
protected override bool EnableStructMapping => true;
}
启动项目后,它仅限于执行实体结构的添加操作,而不会对现有结构进行修改。举例来说,当在Student类中新增一个Age属性时,该框架会自动在数据库中添加对应的Age列。然而,如果尝试删除Name列,数据库将不会做出任何改动,保持原状。
配置对象数据模型
我们可以通过重写对象上下文的CreateModel方法来自定义配置对象数据模型。在CreateModel方法中,我们可以设置表名、主键、索引、自增以及模型之间的关系等属性,以满足特定的业务需求。通过这种方式,我们可以灵活地配置数据模型,以适应不同的数据库架构和业务规则。
本章节将简单介绍如何配置对象数据模型,更高级的用法请参阅“系统建模”章节以获取更多详细信息。
protected override void CreateModel(ModelBuilder modelBuilder)
{
//设置集合为主键
var entity = modelBuilder.Entity<Student>();
entity.Attribute(p=>p.Strings)
.HasValueGetter(
model => model.Strings.Length > 0 ? string.Join(",", model.Strings) : "")
.HasValueSetter<string>(
(model, s) =>
{
if (!string.IsNullOrEmpty(s)) model.Strings = s.Split(',');
});
//此处设置的表名 主键 是否自增
entity.ToTable("Student");
entity.HasKeyAttribute(p=> p.Id);
entity.HasKeyIsSelfIncreased(true);
}