2013-07-21 17 views
13

Miałem projekt biblioteki klas, który korzystał z Entity Framework i działało dobrze, dopóki nie przeniosłem modelu do oddzielnego projektu typu biblioteki klas.Nie można rozpoznać zespołu Model.dll

Po przeniosłem model się do osobnego projektu biblioteki klasy nazwie modelu, zmieniłem ciąg połączenia w app/web.config w brzmieniu:

<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" /> 

(podaję podziały wierszy .. w powyższym fragmencie na celu wyłącznie dla czytelności Mój kod nie ma tych podziałów wierszy)

teraz moja struktura rozwiązanie wygląda tak:

enter image description here

Jednak dostaję FileNotFound wyjątek w czasie wykonywania, który brzmi:

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: 

Próbowałem scenariusz z 2 klientów, a mianowicie aplikacji konsoli i aplikacji MVC.

Podczas gdy aplikacja konsolowa nawet nie kopiuje BusinessObjects.dll i jej odnośników do biblioteki DLL, a mianowicie Model.dll do katalogu aplikacji konsoli bin, robi to aplikacja MVC. Jednak oba wydają się nie znajdować w ogóle zespołu Model.dll i podnieść wyżej wymieniony FileNotFoundException.

+2

Czy sprawdziłeś platformę (AnyCPU, x86) i strukturę docelową dla każdego projektu? –

+0

Dziękuję. Tak. –

+1

Użyj narzędzia Fuslogvw.exe, aby rozwiązać problemy z rozwiązywaniem zespołów. Jego ślad pokazuje, gdzie szukał pliku. –

Odpowiedz

1

Myślę, że problem jest z EF ConStr. Zazwyczaj, gdy chcesz użyć osadzonego zasobu, należy ustawić Metadata jak następuje:

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

Można również użyć * wieloznacznego zamiast <assemblyFullName>. Powoduje wyszukiwanie następujących lokalizacji pliku w czasie wykonywania:

  • Zestaw wywołujący.
  • Opisane złożenia.
  • Zespoły w katalogu bin aplikacji.

Więcej informacji jest here

+0

Dzięki. Jeśli przyjrzysz się dokładnie temu pytaniu, właśnie to już zrobiłem. –

+0

Ale nie ustawiasz zestawu ...! poprawny format to 'metadata = res: // /Model.dll'. Czy się mylę?! – AminSaghi

+0

Entity Framework deleguje wygląd zestawu do domyślnego resolvera zespołu dostępnego w ramach .NET, który jest częścią interfejsu API Reflect. Możesz nadać mu pełną nazwę zespołu lub po prostu nazwę. –

6

1) Zmień res://Model.dll/ do res://Model/ (bez '.dll' rozszerzenie) we wszystkich miejscach, w ciągu połączenia. Można również podać pełną nazwę zespołu, na przykład: res://Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null/ (więcej informacji na: https://msdn.microsoft.com/en-us/library/cc716756.aspx).

2) Następnie upewnij się, że następująca przestrzeń nazw jest poprawna: Model.Models.ResourceGlobalizationModel. Jeśli nie, zmień odpowiednio ciąg połączenia i/lub nazwę zespołu.

0

Przenieśliłem model Ecom.edfx EF do własnego folderu (Ecom).
Przyjazd Web.config/(app.config) jeśli EF ciąg połączenia generowane ma to metadane ustawione następująco

<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" /> 

(struktura katalogów jest zrobione z . (kropka) nie / (ukośnik)) jak po res: // /Ecom.Ecom.csdl (od bycia res: // /Ecom.csdl, podczas gdy nie jest w swoim własnym folderze).

Powiązane problemy