Servicestacks GenerateCrudServices生成错误SQL及代码生成失效问题
问题解决方案
1. 修复GetTableSchemas()的SQL语法错误
SQL Server要求OFFSET ... FETCH必须搭配ORDER BY,你可以全局覆盖GetTableSchemas方法,改用TOP 1的写法规避该问题:
GenerateCrudServices = new GenerateCrudServices { DbFactory = dbFactory, // 全局替换SQL生成逻辑,避免OFFSET FETCH语法问题 GetTableSchemas = (db) => db.GetTableSchemas(db.From<SqlTable>() .Select(SqlTable.AllColumns) .Take(1) .ToSql()), // 其他配置项... };
也可以给OFFSET FETCH补充固定排序条件:
GetTableSchemas = (db) => db.GetTableSchemas("SELECT * FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY");
2. 解决配置被忽略、生成演示类的问题
配置未生效通常是演示项目的默认逻辑在干扰,按以下步骤排查:
关闭自动注册:将
AutoRegister设为false,避免自动加载演示项目的Crud服务:GenerateCrudServices = new GenerateCrudServices { DbFactory = dbFactory, AutoRegister = false, // 关键:阻止自动注册演示服务 CreateServices = { new CreateCrudServices { Schema = "lookup", IncludeTables = ["absence"]}, }, };验证数据库连接:检查
dbFactory的连接字符串,确保连接的是你的SQL Server数据库而非演示默认库,可通过服务端日志确认实际连接的数据库信息。清理缓存/指定输出路径:执行
x csharp时可能读取旧缓存文件,先删除已生成的dtos.cs再重新执行,或指定输出路径避免覆盖:x csharp https://localhost:5001 -o ./MyCustomModels.cs移除演示服务注册:如果项目中存在针对booking等演示表的CrudServices注册代码,需完全删除,避免和自定义配置冲突。
检查表名与Schema:确认SQL Server中存在
lookup.absence表,配置中的名称拼写、大小写是否匹配(SQL Server默认不区分大小写,但拼写错误会导致无法识别)。
3. 自定义GetTableColumns的正确姿势
若要为特定服务自定义GetTableColumns,需将配置放在对应CreateCrudServices实例内部,而非全局:
CreateServices = { new CreateCrudServices { Schema = "lookup", IncludeTables = ["absence"], GetTableColumns = (IDbConnection db, string table, string schema) => db.GetTableColumns($"SELECT TOP 1 * FROM {SqlServerDialect.Provider.GetQuotedTableName(table, schema)}") }, },
内容的提问来源于stack exchange,提问作者Benjamin79
相关产品推荐
相关产品推荐

