Po pierwsze, jest to związane z innego pytanie tutaj na SO:Entity Framework 6: Nie można załadować określony metadanych zasobu
Czytałem i debugowania mój problem z następujących SO artykuł & blogu:
MetadataException: Unable to load the specified metadata resource
i
http://blogs.teamb.com/craigstuntz/2010/08/13/38628/
ALE ... Nadal mam pytania poza tylko ten 'fix'
Mam WebAPI (2.1), ciąg połączenia w moim WebAPI jest tak:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://*/ProjectModel.csdl|
res://*/ProjectModel.ssdl|
res://*/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
Kiedy zadzwonić ToList()
na DbSet
moim WebAPI (pseudo kod):
DbContext _DbContext = new ProjectEntities();
DbSet<TEntity> _dbSet = _DbContext.Set<TEntity>();
_dbSet.ToList();
Działa świetnie!
Kiedy zadzwonić tego samego od wewnątrz usługi Windows, pojawia się następujący błąd:
Wpis app.config dla ciąg połączenia jest dokładnie taka sama jak web.config:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://*/ProjectModel.csdl|
res://*/ProjectModel.ssdl|
res://*/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
teraz blog pokazuje odwołać dll ręcznie tak:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://Project.Data.dll/ProjectModel.csdl|
res://Project.Data.dll/ProjectModel.ssdl|
res://Project.Data.dll/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
To nie działa/rozwiązać problem
jedyny sposób byli w stanie go naprawić, jest użycie nazwy w pełni kwalifikowaną:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.csdl|
res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.ssdl|
res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.250.125\sqlexpress;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
Dlaczego to działa w ten sposób? Dlaczego to działa w projekcie sieciowym, ale nie w projekcie usługi Windows? Niedawno zmieniłem EF5 na EF6, a ten błąd pojawił się - cały ten kod działał poprzednio przy uaktualnianiu EF. Czy ktoś ma jakiekolwiek wgląd, dlaczego i jak/jeśli mogę po prostu użyć * dla nazwy dll w ciągu połączenia?
myślałem, że to problem z którym usługa .exe został uruchomiony, a plik nie został skopiowany lokalnie, ale nope The Project.Data.dll istnieje i jest to właściwa wersja.
Użyłem FusionLog, aby spróbować znaleźć błąd i nie ma szczęścia. Jestem całkiem zdezorientowany.
Czy Twoja usługa systemu Windows działa pod różnymi poświadczeniami? Czy mają odpowiednie uprawnienia do łączenia się z serwerem sql? – cadsjo
Spróbuj wypalić ciąg połączenia w kodzie, aby sprawdzić, czy problem dotyczy pliku, a nie samego połączenia. – Shoe