4

サーバーへの接続が存在しないときに一種のバッファとして使用されるローカル データベース (SQL CE) があるプロジェクトに取り組んでいます。サーバーでは、同じデータベース レイアウトを使用したいと考えています。

もちろん、サーバーとクライアントで利用可能な Common.dll にある同じ EDMX ファイルを使用したいと考えています。

クライアントには、サーバー上の provider=System.Data.SqlClient である間、 provider=System.Data.SqlServerCe.3.5 の接続文字列があります。

私の問題は、サーバー側に sth を保存したいときに発生します。

両方の部分で同じ EDMX ファイルを使用する可能性はありますか? または、そのような星座を処理する方法のベストプラクティスはありますか?

ご協力ありがとうございました!

編集: 私の主な質問は: EDMX ファイルを別のプロバイダーで使用できるようにすることは可能ですか? 私の場合、System.Data.SqlServerCe.3.5 と System.Data.SqlClient!

4

3 に答える 3

3

本番アプリケーションで動作する正確なシナリオがあります。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());
#>
于 2012-11-09T18:15:45.607 に答える
0

これは、他の回答で述べたように、SSDLの異なるコピーを保持することで実行できますが、通常はCodeFirstを使用する方がはるかに簡単です。Code Firstは、使用されている接続に基づいてさまざまなモデルを自動的に作成します。したがって、SQLCEデータベースまたはSQLServerデータベースのいずれかに同じコードを指定する必要があります。さまざまなSSDLをいじる必要はありません。

于 2012-11-09T18:08:09.423 に答える
0

ここで説明されている解決策を見つけました: http://www.codeproject.com/Articles/309858/Preparing-an-Entity-Framework-model-for-multi-prov

EDMX ファイルから一部 (SSDL) をコピーする必要があるため、完全ではありません。そのため、EDMX ファイルに変更を加えたらすぐにこのファイルを更新することを忘れないでください。

誰かがより良い方法を持っている場合、私はまだそれを受け入れています。

于 2012-11-09T14:50:28.117 に答える