Advantage数据提供程序结合EF5使用时连接字符串CommType属性无法识别
CommType 识别报错的核心原因
代码中手动构造AdsConnection可正常连接,说明你写的参数值、使用的Advantage数据提供程序版本都是兼容的。配置文件场景下报CommType无法识别,90%的原因是连接字符串没有被Advantage提供程序解析,而是被EF默认关联的SqlClient提供程序拦截——SqlClient的连接字符串解析器完全不识别Advantage专属的CommType等参数,自然会抛出无法识别属性的错误。
直接在配置文件中写入连接参数的实现
Advantage数据提供程序本身就支持所有自定义连接参数直接写入连接字符串,不需要强制依赖ads.ini,只要做好以下3步,就能彻底解决参数不识别的问题:
- 正确配置连接字符串节点,必须为每个连接字符串指定匹配的
providerName="Advantage.Data.Provider",从根源上避免SqlClient解析器错配。示例配置(可直接写入web.config或你使用的自定义properties.config):<connectionStrings> <add name="AdsEFContext" connectionString="data source=\\SERVER1\DATA;ServerType=remote;TableType=CDX;CommType=TCP_IP;RETRY_ADS_CONNECTS=5;PACKET_SIZE=512;USE_TCP_IP=1" providerName="Advantage.Data.Provider" /> </connectionStrings> - 调整EF5的DbContext初始化逻辑,直接传入配置的连接字符串名称,不要让EF自动推断连接类型:
public class AdsDbContext : DbContext { // 传入配置中的连接字符串名称,EF会自动匹配Advantage的连接实现 public AdsDbContext() : base("name=AdsEFContext") { } // 定义业务对应的DbSet即可 } - 在web.config的entityFramework节点下注册Advantage对应的实体连接工厂,避免EF加载默认的SqlClient连接工厂:
<entityFramework> <providers> <provider invariantName="Advantage.Data.Provider" type="Advantage.Data.Entity.AdvantageEntityConnection, Advantage.Data.EF" /> </providers> </entityFramework>
ads.ini 配置的正确存放与加载规则
之前你将ads.ini放到wwwroot/site/bin目录下不生效,核心是路径不符合Advantage提供程序的默认查找规则。提供程序加载ads.ini的优先级顺序为:
- 连接字符串中通过
AdsIniPath参数明确指定的文件绝对路径(可靠性最高,不会出现查找偏差) - 当前应用程序域的基目录:即Web应用的站点根目录
wwwroot/site,而非其下的bin子目录 - 系统PATH环境变量中配置的全局目录
你需要调整ads.ini的内容为标准格式:
[Advantage] RETRY_ADS_CONNECTS=5 PACKET_SIZE=512 USE_TCP_IP=1 CommType=TCP_IP
最稳妥的加载方式:将编辑好的ads.ini放置到站点根目录wwwroot/site下,同时在连接字符串中追加参数指定文件路径,彻底避免查找失败:
data source=\\SERVER1\DATA;ServerType=remote;TableType=CDX;AdsIniPath=C:\inetpub\wwwroot\site\ads.ini
配置完成后,所有写在ads.ini中的参数会被自动加载,不需要在连接字符串中重复定义。
注意:不要将Advantage的专属连接参数放到appSettings等自定义配置节点中,EF5仅会从定义的数据库连接字符串中解析连接参数,放错节点会导致参数完全不生效。
内容的提问来源于stack exchange,提问作者Gaston Valiente
相关产品推荐
相关产品推荐

