适用于不同提供商的相同EDMX文件

我正在开发一个项目,我有一个本地数据库(SQL CE),它用作缓冲区,而不存在与服务器的连接。 在服务器上,我想使用相同的数据库布局。

当然我想使用服务器和客户端上可用的Common.dll中的相同EDMX文件。

在客户端中,我有一个与provider = System.Data.SqlServerCe.3.5的连接字符串,而它是服务器上的provider = System.Data.SqlClient。

当我想在服务器端保存时,我的问题出现了:“给定的提供者清单不是’System.Data.SqlClient.SqlProviderManifest’类型。”

是否有机会在两个部件上使用相同的EDMX-File? 或者有没有最佳实践如何处理这样的星座?

谢谢您的帮助!

编辑:我的主要问题是:是否可以启用EDMX文件与不同的提供商一起使用? 在我的情况下System.Data.SqlServerCe.3.5和System.Data.SqlClient!

我们在生产应用程序上有确切的方案。 我们使用T4模板基于规范的SQL EDMX文件生成SQLCE EDMX文件。 这将为您留下2个EDMX文件,您可以在实例化单个上下文时切换这些文件….

serverType = "sqlserverce" (or) "sqlserver"; var entityBuilder = new EntityConnectionStringBuilder { Provider = ..., ProviderConnectionString = ..., Metadata = string.Format("res://*/{0}.{1}.csdl|res://*/{0}.{1}.ssdl|res://*/{0}.{1}.msl", EdmxName, serverType) }; 

SQLCE EDMX T4代码看起来像这样……

 <#@ template debug="false" hostspecific="true" language="C#" #> <#@ output extension=".edmx" #> <#@ assembly name="System.Xml.dll" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Xml" #> <# var document = new XmlDocument(); document.Load(this.Host.ResolvePath("DbContext.edmx")); var namespaceManager = new XmlNamespaceManager(document.NameTable); namespaceManager.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2008/10/edmx"); namespaceManager.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl"); var storageModelsNode = document.SelectSingleNode("//edmx:StorageModels", namespaceManager); foreach (XmlElement schemaNode in storageModelsNode.SelectNodes("ssdl:Schema", namespaceManager)) { schemaNode.SetAttribute("Provider", "System.Data.SqlServerCe.4.0"); schemaNode.SetAttribute("ProviderManifestToken", "4.0"); foreach (XmlElement propertyNode in schemaNode.SelectNodes("ssdl:EntityType/ssdl:Property[@Type='varbinary(max)']", namespaceManager)) { propertyNode.SetAttribute("Type", "image"); } foreach (XmlElement propertyNode in schemaNode.SelectNodes("ssdl:EntityType/ssdl:Property[@Type='varchar']", namespaceManager)) { propertyNode.SetAttribute("Type", "nvarchar"); } } var stringBuilder = new StringBuilder(); using (var stringWriter = new StringWriter(stringBuilder)) using (var xmlWriter = new XmlTextWriter(stringWriter) { Formatting = Formatting.Indented }) { document.WriteTo(xmlWriter); } Write(stringBuilder.ToString()); #> 

我找到了一个解决方案,在这里描述: http : //www.codeproject.com/Articles/309858/Preparing-an-Entity-Framework-model-for-multi-prov

它并不完美,因为你必须从EDMX文件中复制一个部分(SSDL)。 因此,您需要记住在更改EDMX文件后立即更新此文件。

如果有人有更好的方式我仍然愿意接受它。

这可以通过保留SSDL的不同副本来完成,如另一个答案中所述,但使用Code First通常要容易得多。 Code First将根据使用的连接自动创建不同的模型。 因此,您只需要在SQL CE数据库或SQL Server数据库中指向相同的代码。 不要弄乱所需的不同SSDL。