编程语言
首页 > 编程语言> > c# – 针对不同提供商的相同EDMX文件

c# – 针对不同提供商的相同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());
#>

标签:c,sql-server,entity-framework,sql-server-ce
来源: https://codeday.me/bug/20190629/1330717.html