为什么Linq2Db无法识别Oracle中的表?需要满足什么访问要求?
Linq2db Oracle表识别要求与权限申请说明
一、Linq2db T4模板识别表的核心要求
- 账号拥有Oracle系统元数据视图的访问权限:Linq2db生成模型时会查询
ALL_TABLES、ALL_TAB_COLUMNS、ALL_CONSTRAINTS等系统视图获取表结构信息,账号必须能通过这些视图查询到目标表的元数据。 - 目标对象在当前连接库的元数据中可见:你用到的
MySchema.Sectors@STATS是跨DB Link的远端表,本地库的系统视图默认不会收录远端数据库的表信息,所以模板扫描时找不到对应表记录。 - 配置项与对象属性匹配:你设置的
IncludedSchemas必须和表所属的schema完全一致,同时如果使用同义词、视图等对象,需要开启对应加载配置。
二、需要向数据库管理员申请的权限/操作
- 给READONLY_ACCOUNT授予系统视图查询权限:授予账号对
ALL_TABLES、ALL_TAB_COLUMNS、ALL_CONS_COLUMNS、ALL_CONSTRAINTS、ALL_OBJECTS的SELECT权限。 - 在本地库MySchema下创建远端表的同义词:执行语句
CREATE SYNONYM MySchema.Sectors FOR MySchema.Sectors@STATS;,让远端表以本地同义词的形式存在,才能被元数据扫描识别。 - 给READONLY_ACCOUNT授予同义词的SELECT权限,以及DB Link STATS的访问权限,确保可以正常查询数据。
三、T4模板调整方案
修改你的.tt配置,开启同义词加载开关:
NamespaceName = "DataModels"; GetSchemaOptions.IncludedSchemas = new []{ "MySchema" }; GetSchemaOptions.LoadSynonyms = true; // 新增本行开启同义词加载 LoadOracleMetadata(IpAddress, "1521", "DB", "READONLY_ACCOUNT", "password$"); GenerateModel();
生成实体类后,给Sectors类补充Server属性指定DB Link,即可生成你需要的带@STATS的查询语句:
[Table(Schema = "MySchema", Name = "Sectors", Server = "STATS")] public class Sectors { [Column] public int Id { get; set; } [Column] public string Name { get; set; } }
内容的提问来源于stack exchange,提问作者Robin Bennett
相关产品推荐
相关产品推荐

