在Blazor .Net Framework中使用DLL导入的ADO.NET Entity Model报连接串错误如何解决
问题根因
你踩了两个核心误区:
- 旧版ADO.NET Entity Model对应的是EF6及更早版本,这类版本的实体上下文默认只会读取 ASP.NET Framework项目的
web.config配置文件 里的<connectionStrings>节点,不会自动识别appsettings.json里的配置。 - 你手动注入上下文时,要么是没正确加载
appsettings.json导致读出来的连接串为空,要么是传的是普通SQL连接串、不是EF要求的带元数据的完整连接串,最终上下文还是会 fallback 去读配置文件,就触发了找不到配置的报错。
解决方法
方案一(推荐,最适配旧EF逻辑)
直接用EF6默认的配置规则,不需要改注入逻辑:
- 打开Blazor项目根目录的
web.config文件,在<configuration>节点下添加如下配置:
<configuration> <!-- 其他已有配置 --> <connectionStrings> <add name="MyDBEntities" connectionString="metadata=res://*/你的模型文件名.csdl|res://*/你的模型文件名.ssdl|res://*/你的模型文件名.msl;provider=System.Data.SqlClient;provider connection string="你的实际SQL连接字符串"" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>
注意connectionString里的metadata部分要和你原来存实体模型的类库项目里的配置完全一致,只需要把provider connection string里的内容替换成你实际的数据库连接信息即可。
- 删掉你之前写的手动传连接串的注入代码,直接简化为:
services.AddScoped<MyDBEntities>();
上下文默认构造函数会自动读取web.config里的对应配置。
方案二(一定要用appsettings.json的情况)
- 先确保
appsettings.json里存的是EF要求的完整实体连接串(就是上面带metadata的整串,不是普通SQL连接串)。 - ASP.NET Framework默认不会加载
appsettings.json,你需要在Startup的构造函数里手动添加配置加载逻辑:
public class Startup { public IConfiguration Configuration { get; } public Startup() { var builder = new ConfigurationBuilder() .SetBasePath(HttpRuntime.AppDomainAppPath) .AddJsonFile("appsettings.json"); Configuration = builder.Build(); } // 其他代码 }
- 如果自动生成的
MyDBEntities没有公开的接受字符串参数的构造函数,添加一个partial类扩展:
public partial class MyDBEntities { public MyDBEntities(string connectionString) : base(connectionString) { } }
- 你之前写的注入代码就可以正常生效了。
内容的提问来源于stack exchange,提问作者Berzohr
相关产品推荐
相关产品推荐

