Skip to content

LicoCode/Opcenter.Execution.Data

Repository files navigation

Opcenter.Execution.Data

只读数据访问层:用 EF Core 查询 Opcenter(Camstar)库。写交易请走 Opcenter.Execution.Services(AppServer),本库拦截 SaveChanges

仓储 API 细节见 Docs/repository-api-matrix.md

项目结构

Opcenter.Execution.Data/
├── DbContexts/           # OpcenterExDbContext、模型扩展
├── Entities/             # Camstar 实体(按 CDO 继承树组织)
├── Extensions/           # AddOpcenterExDbServices 等
├── Repositories/         # 仓储接口与 Implementations/
├── Services/             # OpcenterExDbClient(复杂 LINQ 入口)
├── Specifications/       # 规格模式
├── UnitOfWork/           # IUnitOfWork
└── Docs/                 # 仓储 API 约定等

核心功能

1. 数据库上下文

  • OpcenterExDbContext:主上下文;支持 SchemaQualifyTable 供原生 SQL 使用
  • 默认 QueryTrackingBehavior.NoTracking;存在写状态时 SaveChanges* 抛错

2. 实体

常见类型:ContainerProductMfgOrderResourceUserCodeWorkflow 等,命名空间 Opcenter.Execution.Data.Entities

3. 仓储

  • 开放泛型:IRepository<T>INamedDataObjectRepository<T>IRevisionedObjectRepository<T>
  • 领域仓储:如 IMfgOrderRepositoryIContainerRepositoryIProductRepository 等(由 AddOpcenterExDbServices 按约定自动注册)

4. 工作单元

  • IUnitOfWork:协调多仓储(只读场景下主要用于统一访问上下文)

5. 数据库客户端

  • OpcenterExDbClient:仅提供 RunQueryAsync(在 AsNoTrackingIQueryable 上组合复杂 LINQ)
  • 示例见 Services/OpcenterExDbClient.ComplexQueryExamples.cs(可复制到业务代码)

6. DI 扩展

  • AddOpcenterExDbServices:注册 DbContext、仓储、OpcenterExDbClientIUnitOfWork

依赖项

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Proxies
  • Microsoft.EntityFrameworkCore.SqlServer
  • Oracle.EntityFrameworkCore

使用方法

1. 注册服务

services.AddOpcenterExDbServices(options =>
{
    options.ConnectionString = configuration["CamstarDb:ConnectionString"]!;
    options.DatabaseType = DatabaseType.SqlServer; // 或 DatabaseType.Oracle
    options.Schema = configuration["CamstarDb:Schema"]; // 可空
});

WebApi 宿主封装见 WebApi/Hosting/OpcenterHostExtensions.cs(读取 CamstarDb:DbType / ConnectionString / Schema)。

2. 注入使用

public class MyService(
    INamedDataObjectRepository<Factory> factories,
    IMfgOrderRepository mfgOrders,
    OpcenterExDbClient db)
{
    public async Task DoSomethingAsync(CancellationToken ct)
    {
        var factory = await factories.GetFirstByNameAsync("Test", ct);
        var enterpriseName = factory?.Enterprise?.Name;

        var orders = await mfgOrders.GetAllAsync(ct);

        var filtered = await db.RunQueryAsync<MfgOrder, List<MfgOrder>>(async (q, token) =>
            await q
                .Where(o => o.OrderStatus != null && o.OrderStatus.Name == "Released")
                .Take(100)
                .ToListAsync(token), ct);
    }
}

配置

{
  "CamstarDb": {
    "DbType": "MsSql",
    "ConnectionString": "<connection-string>",
    "Schema": "<optional-schema>"
  }
}

DbTypeORACLE(忽略大小写)时使用 Oracle,其余按 SQL Server。

注意事项

  1. 连接串与账号勿写入仓库或文档明文。
  2. 本层只查询;建模/交易变更走 AppServer 客户端。
  3. Oracle 需正确安装并引用 Oracle.EntityFrameworkCore
  4. 简单查询优先仓储;复杂 Include / Join / 投影用 RunQueryAsync;原生 SQL 表名用 QualifyTable
  5. 懒加载已启用,列表接口仍建议显式 Include 或投影,避免 N+1。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages