Wat*_* v2 13 .net reflection entity-framework
我有一个使用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="
Data Source=MyComputer\sqlexpress;
Initial Catalog=DaDatabase;
Integrated Security=true;
MultipleActiveResultSets=True"" 
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.
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.如果不是,请相应地更改连接字符串和/或程序集名称.
我认为问题出在 EF ConStr 上。通常,当您想要使用嵌入资源时,您应该进行Metadata如下设置:
Metadata=res://<assemblyFullName>/<resourceName>. 
您还可以使用*通配符代替<assemblyFullName>。它会导致在运行时搜索以下位置的文件:
更多信息在这里
| 归档时间: | 
 | 
| 查看次数: | 6166 次 | 
| 最近记录: |