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: 

我尝试了 2 个客户端的场景,即一个控制台应用程序和一个 MVC 应用程序。

虽然控制台应用程序甚至不会复制BusinessObjects.dll其引用的 dll,即复制Model.dll到控制台应用程序的bin目录,但 MVC 应用程序会。然而,他们两个似乎根本没有找到Model.dll大会,并提出了上述问题FileNotFoundException

4

3 回答 3

7

1) 在连接字符串的所有位置更改res://Model.dll/res://Model/(不带“.dll”扩展名)。您还可以指定程序集的全名,例如:(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.config/( )app.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 回答