无法参数化Entity Framework连接字符串的问题求助
问题原因及解决方法
问题本质
你用EDMX生成的DbContext属于Database First/Model First模式,这种模式要求传入的是Entity Framework专用连接字符串(包含模型元数据信息),而你用SqlConnectionStringBuilder生成的是普通SQL Server连接字符串,EF识别不到元数据,就会默认切换到Code First模式,和你现有的EDMX模型冲突,从而抛出UnintentionalCodeFirstException。
解决方法
方法一:构建完整的Entity Framework连接字符串
通过EntityConnectionStringBuilder把SQL连接字符串和EDMX的元数据路径结合起来,生成符合要求的连接字符串:
private string GetEntityConnectionString() { // 构建SQL Server基础连接信息 var sqlBuilder = new SqlConnectionStringBuilder { DataSource = "localhost", UserID = "sa", Password = "1234", InitialCatalog = "dbtest" }; // 构建EF专用连接字符串,替换Metadata里的模型名称为你的EDMX对应名称 var entityBuilder = new EntityConnectionStringBuilder { Provider = "System.Data.SqlClient", ProviderConnectionString = sqlBuilder.ConnectionString, // 元数据路径可直接复制app.config中原有EF连接字符串的Metadata部分 Metadata = "res://*/tallerdemecanicaModel.csdl|res://*/tallerdemecanicaModel.ssdl|res://*/tallerdemecanicaModel.msl" }; return entityBuilder.ConnectionString; }
修改测试代码调用该方法:
private void button1_Click(object sender, EventArgs e) { using (tallerdemecanicaEntities db = new tallerdemecanicaEntities(GetEntityConnectionString())) { var list = db.vta_factura.ToList(); dataGridView1.DataSource = list; } }
方法二:直接传入EntityConnection对象
创建EntityConnection实例并传给DbContext(需确保DbContext有接收DbConnection的构造函数):
private EntityConnection GetEntityConnection() { var sqlBuilder = new SqlConnectionStringBuilder { DataSource = "localhost", UserID = "sa", Password = "1234", InitialCatalog = "dbtest" }; var entityBuilder = new EntityConnectionStringBuilder { Provider = "System.Data.SqlClient", ProviderConnectionString = sqlBuilder.ConnectionString, Metadata = "res://*/tallerdemecanicaModel.csdl|res://*/tallerdemecanicaModel.ssdl|res://*/tallerdemecanicaModel.msl" }; return new EntityConnection(entityBuilder.ConnectionString); }
测试代码调用:
private void button1_Click(object sender, EventArgs e) { using (var connection = GetEntityConnection()) // 第二个参数false表示不接管连接生命周期,由using块负责释放 using (tallerdemecanicaEntities db = new tallerdemecanicaEntities(connection, false)) { var list = db.vta_factura.ToList(); dataGridView1.DataSource = list; } }
注意事项
- 元数据路径中的模型名称要和你的EDMX文件名一致,不确定的话可以打开
app.config,复制原有EF连接字符串里的Metadata部分直接使用。 - 如果你的
DbContext没有接收DbConnection的构造函数,需要手动添加:public tallerdemecanicaEntities(DbConnection connection, bool contextOwnsConnection) : base(connection, contextOwnsConnection) { }
内容的提问来源于stack exchange,提问作者jebus
相关产品推荐
相关产品推荐

