13

Entity Framework を使用するクラス ライブラリ プロジェクトがあり、モデルを別のクラス ライブラリ タイプのプロジェクトに移動するまでは正常に機能しました。

モデルを Model という別のクラス ライブラリ プロジェクトに移動した後、app/web.config の接続文字列を次のように変更しました。

<add name="GlobalizationEntities" 
connectionString="metadata=res://Model.dll/Models.ResourceGlobalizationModel.csdl|
res://Model.dll/Models.ResourceGlobalizationModel.ssdl|
res://Model.dll/Models.ResourceGlobalizationModel.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
Data Source=MyComputer\sqlexpress;
Initial Catalog=DaDatabase;
Integrated Security=true;
MultipleActiveResultSets=True&quot;" 
providerName="System.Data.EntityClient" />

(上記のスニペットには、読みやすくするために意図的に改行を入れています。私のコードには、これらの改行がありません。)

今、私のソリューション構造は次のようになります。

ここに画像の説明を入力

ただし、FileNotFound実行時に次のような例外が発生します。

System.IO.FileNotFoundException was unhandled by user code
  HResult=-2147024894
  Message=Unable to resolve assembly 'Model.dll'.
  Source=System.Data.Entity
  StackTrace:
       at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.ResolveAssemblyName(String assemblyName, MetadataArtifactAssemblyResolver resolver)
       at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
       at System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
       at System.Data.Metadata.Edm.MetadataCache.SplitPaths(String paths)
       at System.Data.Common.Utils.Memoizer`2.<>c__DisplayClass2.<Evaluate>b__0()
       at System.Data.Common.Utils.Memoizer`2.Result.GetValue()
       at System.Data.Common.Utils.Memoizer`2.Evaluate(TArg arg)
       at System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections)
       at System.Data.Objects.ObjectContext.RetrieveMetadataWorkspaceFromConnection()
       at System.Data.Objects.ObjectContext..ctor(EntityConnection connection, Boolean isConnectionConstructor)
       at System.Data.Objects.ObjectContext..ctor(String connectionString, String defaultContainerName)
       at Resources.BaseServices.Globalization.Models.ResourceGlobalizationEntities..ctor() in C:\SVN\Model\ResourceGlobalizationEntities.cs:line 7
       at Resources.BaseServices.Globalization.Models.Culture.IsValidCulture(String shortName) in C:\SVN\Model\Culture.cs:line 24
       at Resources.BaseServices.Globalization.EntityFrameworkStringResourceLoader.set_CultureName(String value) in C:\SVN\BusinessObjects\EntityFrameworkStringResourceLoader.cs:line 129
       at Resources.BaseServices.Globalization.EntityFrameworkStringResourceLoader..ctor(String cultureName, IDataSource dataSource) in C:\SVN\BusinessObjects\EntityFrameworkStringResourceLoader.cs:line 19
  InnerException: 

コンソール アプリと MVC アプリの 2 つのクライアントでシナリオを試しました。

BusinessObjects.dllコンソール アプリは、参照されている dll をModel.dllコンソール アプリケーションのbinディレクトリにコピーすることさえしませんが、MVC アプリはコピーします。しかし、どちらもModel.dllアセンブリをまったく見つけていないようで、上記のFileNotFoundException.

4

3 に答える 3

7

1)接続文字列のすべての場所を (「.dll」拡張子なしで) に変更res://Model.dll/します。res://Model/次のように、アセンブリの完全な名前を指定することもできますres://Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null/(詳細: https://msdn.microsoft.com/en-us/library/cc716756.aspx )。

2) 次に、次の名前空間が有効であることを確認します: Model.Models.ResourceGlobalizationModel. そうでない場合は、それに応じて接続文字列やアセンブリ名を変更します。

于 2015-05-03T12:48:56.703 に答える
1

問題はEF ConStrにあると思います。通常、埋め込みリソースを使用する場合はMetadata、次のように設定する必要があります。

Metadata=res://<assemblyFullName>/<resourceName>. 

*の代わりにワイルドカードを使用することもできます<assemblyFullName>。これにより、 は実行時に次の場所でファイルを検索します。

  • 呼び出し元のアセンブリ。
  • 参照されたアセンブリ。
  • アプリケーションの bin ディレクトリ内のアセンブリ。

詳細はこちら

于 2013-07-21T13:29:51.480 に答える
0

Ecom.edfxEF モデルを独自のフォルダー ( )に移動しEcomました。生成された EF 接続文字列のメタデータが次のように設定されている場合は、 /( )
をチェックインします。Web.configapp.config

<add name="EcomEntities" connectionString="metadata=res://*/Ecom.Ecom.csdl|res://*/Ecom.Ecom.ssdl|res://*/Ecom.Ecom.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;data source=****&quot;" providerName="System.Data.EntityClient" />

(ディレクトリ構造は(スラッシュ).ではなく (ドット)で行います) 次のようにres:// /Ecom.Ecom.csdl (自分のフォルダーにないのにres:// /Ecom.csdlであることから)。/

于 2016-05-25T11:30:54.530 に答える