In primo luogo, questo è legato ad un'altra domanda qui su SO:Entity Framework 6: Impossibile caricare la risorsa metadati specificato
ho letto e il debug il mio problema con il seguente articolo SO & blog:
MetadataException: Unable to load the specified metadata resource
e
http://blogs.teamb.com/craigstuntz/2010/08/13/38628/
MA ... Ho ancora domande al di là proprio questa 'correzione'
Ho un WebAPI (2.1), la stringa di connessione nel mio WebAPI è così:
<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" />
Quando chiamo ToList()
su un DbSet
nel mio WebAPI (pseudo codice):
DbContext _DbContext = new ProjectEntities();
DbSet<TEntity> _dbSet = _DbContext.Set<TEntity>();
_dbSet.ToList();
Funziona benissimo!
Quando chiamo la stessa all'interno di un WINDOWS SERVICE, ottengo il seguente errore:
La voce app.config per la stringa di connessione è esattamente la stessa della 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" />
Ora, il blog mostra per fare riferimento al dll manualmente come così:
<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>
questo non funziona/risolvere il problema
L'unico modo sono stato in grado di risolvere il problema, è quello di utilizzare il nome completo:
<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>
Perché funziona così? Perché dovrebbe funzionare in un progetto Web, ma non in un progetto di servizio Windows ?? Di recente ho cambiato da EF5 a EF6, e questo errore è apparso - tutto questo codice ha funzionato prima di aggiornare EF. Qualcuno ha qualche idea sul perché e come/se posso semplicemente usare * per il nome dll nella mia stringa di connessione?
ho pensato che fosse una questione di dove il servizio exe era in esecuzione e un file non è stato copiato a livello locale, ma no, il Project.Data.dll c'è ed è la versione giusta.
Ho usato FusionLog per cercare di trovare l'errore, e senza fortuna lì. Sono abbastanza confuso.
Il servizio Windows è in esecuzione con credenziali diverse? Hanno i diritti appropriati per connettersi al server sql? – cadsjo
Prova a cuocere la stringa di connessione nel codice per vedere se si tratta di un problema con il file rispetto alla connessione stessa. – Shoe