只读数据访问层:用 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 约定等
OpcenterExDbContext:主上下文;支持Schema;QualifyTable供原生 SQL 使用- 默认
QueryTrackingBehavior.NoTracking;存在写状态时SaveChanges*抛错
常见类型:Container、Product、MfgOrder、Resource、UserCode、Workflow 等,命名空间 Opcenter.Execution.Data.Entities。
- 开放泛型:
IRepository<T>、INamedDataObjectRepository<T>、IRevisionedObjectRepository<T> - 领域仓储:如
IMfgOrderRepository、IContainerRepository、IProductRepository等(由AddOpcenterExDbServices按约定自动注册)
IUnitOfWork:协调多仓储(只读场景下主要用于统一访问上下文)
OpcenterExDbClient:仅提供RunQueryAsync(在AsNoTracking的IQueryable上组合复杂 LINQ)- 示例见
Services/OpcenterExDbClient.ComplexQueryExamples.cs(可复制到业务代码)
AddOpcenterExDbServices:注册 DbContext、仓储、OpcenterExDbClient、IUnitOfWork
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Proxies
- Microsoft.EntityFrameworkCore.SqlServer
- Oracle.EntityFrameworkCore
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)。
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>"
}
}DbType 为 ORACLE(忽略大小写)时使用 Oracle,其余按 SQL Server。
- 连接串与账号勿写入仓库或文档明文。
- 本层只查询;建模/交易变更走 AppServer 客户端。
- Oracle 需正确安装并引用
Oracle.EntityFrameworkCore。 - 简单查询优先仓储;复杂 Include / Join / 投影用
RunQueryAsync;原生 SQL 表名用QualifyTable。 - 懒加载已启用,列表接口仍建议显式
Include或投影,避免 N+1。