c# - 不同提供商的相同 EDMX 文件

标签 c# sql-server entity-framework sql-server-ce

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

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

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

当我想在服务器端保存某物时,我的问题就来了:“给定的提供商 list 不是‘System.Data.SqlClient.SqlProviderManifest’类型。”

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

感谢您的帮助!

编辑: 我的主要问题是:是否可以启用 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# - 不同提供商的相同 EDMX 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13297827/

相关文章:

sql-server - 死锁导致部分数据丢失?

entity-framework - Entity Framework : Cannot be configured on 'xxx' class because it is a derived type

c# - Azure AD 如何在用户对我们的应用程序进行身份验证时获取租户 ID

c# - 在外部站点中自动进行字段输入

c# - 从包含在 using 语句中的另一个类中检索数据的正确方法

c# - 从数组中检索正确的 PictureBox 图像

java - 为什么 CLASSPATH 对于 Python 失败但对于 RazorSQL 却有效?

c# - 如何允许我的类在 C# 中隐式转换为字符串?

sql-server - SQL Server 内部是如何处理 Varchar 的?

c# - 带有参数 IQueryable<T> 和 Expression<Func<T, T>> 的 .net 泛型方法