如何更改 Entity Framework 使用的数据库架构(MySQL 数据库)?

4
我在一个项目中使用EntityFramework连接到一个Mysql数据库,提供程序是Devart Dot.connect。
这个应用程序需要使用用户在运行时提供的连接参数连接到数据库,当然包括Mysql数据库的名称。
我使用了EntityConnectionStringBuiler和EntityConnection类来构建和存储自定义连接参数。
问题是,即使有了这些参数,应用程序仍然总是连接到在使用Visual Studio向导设计EntityModel时命名的数据库。 非常奇怪的是,在调试并检查ObjectContext的状态时,自定义连接参数被正确地使用了... 这让我很疯狂!!! 有什么线索吗?

一个代码示例会很有帮助 - 在调试时它实际上是否有效,还是只显示ObjectContext中的正确连接字符串? - Dave Swersky
2个回答

12
在经过一天的研究后,我终于明白问题出在model.edmx文件中。 在这个文件中,每个EntitySet都有一行。在每个EntitySet元素中,都有一个名为schema的属性。对于SQL Server,该属性设置为相关表架构:
EntitySet Name="annee_civile" EntityType="openemisModel.Store.annee_civile" store:Type="Tables" Schema="mydatabase" />
如果你在构建自己的EntityConnection时提供了Schema的名称,似乎会发生冲突,并且最终将使用在edmx文件中定义的Schema,即使你在连接参数中指定了另一个Schema。
解决方案很简单,只需删除edmx文件中Schema的名称。对于MYSQL而言,这种做法可行,但可能不适用于连接到SQL Server的情况。
EntitySet Name="annee_civile" EntityType="openemisModel.Store.annee_civile" store:Type="Tables" Schema="" />
以下是EntityConnectionStringBuilder代码:
string providedString = "User Id=xxxx;Password=xxx;Host=xxxx;Database=anydatabasename"; EntityConnectionStringBuilder entityConnBuilder = new EntityConnectionStringBuilder(); entityConnBuilder.Provider = "Devart.Data.MySql"; entityConnBuilder.Metadata = @"res:///OpenEmisModel.csdl|res:///OpenEmisModel.ssdl|res://*/OpenEmisModel.msl"; entityConnBuilder.ProviderConnectionString = providedString;
以下是EntityConnection和使用它的ObjectContext:
EntityConnection entityConnexionEmis = new EntityConnection(entityConnBuilder.ConnectionString); objectcontextEntities testingContext = new objectcontextEntities(entityConnexionEmis);
现在软件能够连接到任何数据库名称了。希望这能对你有所帮助。

1
希望Devart能够修复他们的dotConnect产品。 - mathijsuitmegen

0
在项目中引用dll Devart.Data.MySql.Entity.EF6.dll。
在应用程序启动之前,在数据库操作之前的某个地方添加以下内容:
var config = MySqlEntityProviderConfig.Instance;
config.Workarounds.IgnoreSchemaName = true;

您需要引用以下内容:
using Devart.Data.MySql.Entity.Configuration;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接