2009-06-11 5 views
15

Abbiamo una soluzione composta da due progetti: un progetto di applicazione della console e un progetto di applicazione Web. Ognuno di questi ha uno schema identico, ma un file .edmx con un nome diverso utilizzato per accedere allo stesso database.Errore Entity Framework - "Il nome EntityContainer deve essere univoco"

L'applicazione della console viene eseguita come operazione pianificata sullo stesso server in cui è ospitata l'applicazione Web. L'applicazione Web contiene un riferimento all'applicazione console in quanto determinate azioni all'interno dell'applicazione Web portano a metodi richiamati dall'applicazione console. Questa combinazione è stata eseguita con successo nel nostro ambiente di staging per molti mesi.

quando viene rilasciato dal vivo che stiamo vedendo il seguente messaggio di errore, almeno una volta al giorno:

schema specificato non è valido. Errori:

ProjectName.csdl (3,4): Errore 0019: Il nome deve essere EntityContainer unico. Un EntityContainer con il nome "ProjectEntities" è già definito . ProjectName.csdl (63,4): errore 0019: ogni nome di tipo in uno schema deve essere univoco. Il nome del tipo "ProjectModel.DataSource" era già definito . ProjectName.csdl (75,4): errore 0019: ogni nome di tipo in uno schema deve essere univoco. Il nome del tipo "ProjectModel.Error" era già definito .

Questo continua, elencando tutti i nomi di tipi nel nostro schema.

Questo errore può essere risolto riciclando il pool di applicazioni o riavviando IIS.

Si prega di notare che l'errore non si verifica fino a quando l'applicazione web è in esecuzione da un po '- non si verifica quando compiliamo o la prima volta che accediamo all'applicazione.

La mia teoria iniziale era che i due contenitori di entità sono in conflitto tra loro perché l'applicazione Web fa riferimento all'applicazione console, ma hanno nomi diversi, il che rende l'errore "Il nome di EntityContainer deve essere univoco.UnityContainer con il nome 'ProjectEntities' è già definito "confuso.

+0

controllare questo link [1]: http://stackoverflow.com/questions/4898794/the-entitycontainer-name-must-be-unique-in-different-assemblies, questo funziona per il mio. Spero ti aiuti !! –

risposta

15

Di fronte a questo problema in passato, ho sempre creato una terza libreria condivisa che contiene il modello di entità, in questo modo si sa che non ci sarà un conflitto di nomi, se si decide di aggiungere una nuova tabella/colonna/metodo per il modello è necessario farlo una sola volta, ecc.

+0

Questo è l'approccio che abbiamo preso per risolvere il problema. – ENX

+0

@ENX forse puoi contrassegnarlo come risposta. – icelava

+0

@icelava - @ ENX non è stato visto per oltre un anno e mezzo :(Puoi sempre votare per rafforzare la risposta;) –

2

Questo errore si verifica quando si hanno più di un file model.edmx in un singolo progetto di libreria di classi o DLL. Sebbene non sia noto il motivo alla base dell'errore, è possibile risolvere questo problema eliminando l'altro modello o spostando l'altro file model.edmx in un'altra libreria di classi.

Inoltre non dimenticare di rimuovere i riferimenti del dll precedente

2

Beh, nel mio caso sto lavorando architettura software spettacolo diverso, perché non ho progetti diferent (DLL), hanno accesso allo stesso database, ma io avere diverse entità all'interno Quindi, quando ho riferimenti in un progetto che richiede tutti o almeno due, ottengo questo errore

Se cambio il nome del contenitore di entità su ognuno, risolvo il problema, ma ora la mia stringa di connessione è diversa e devo includere tutte le stringhe di connessione nel file di configurazione per ogni DLL che mi riferisco.

24

Passare a tale cartella bin ed eliminare manualmente il file dll e pdb.

+4

Questo ha funzionato per me. Avevo ribattezzato una libreria di classi e la vecchia dll era ancora nella cartella bin. – wmcainsh

+0

Questo ha funzionato anche per me! –

+0

Questo ha funzionato anche per me, ho cancellato tutte le vecchie dll presenti nella cartella che sto usando per pubblicare la mia applicazione. – ravithejag

0

Nota: quando si tenta di rinominare un contenitore di entità con quello di un contenitore di entità precedentemente eliminato, è necessario accedere al proprio web.config o app.config ed eliminare la stringa di connessione dalla sezione di configurazione.

3

Solo nel caso qualcuno altro è disperato e non trovando alcuna risposta - ho accidentalmente finito con una copia del mio file .edmx incluso nel progetto in una seconda posizione. Entrambi sono stati inclusi nella build.

;-)

Se questo è accaduto a te, non temere: non è stato il primo.

0

cartella Bin per me era nascosta, quindi abbiamo dovuto mostrare i file nascosti, cancellare i vecchi dll/PPB e includere nel progetto quelli di cui avevo bisogno. Ricostruito, funziona.

5

Modificare il file WebConfig voce di stringa di connessione entità da questo

metadata=res://*/App_Code.AAA.csdl|res://*/App_Code.AAA.ssdl|res://*/App_Code.AAA.msl;provider=System.Data.SqlClient;provider connection string="data source=XXX;initial catalog=XXX;user id=XXX;password=XXX;multipleactiveresultsets=True;App=EntityFramework"" 
providerName="System.Data.EntityClient 

a

metadata=res://MyProject/App_Code.AAA.csdl|res://MyProject/App_Code.AAA.ssdl|res://MyProject/App_Code.AAA.msl;provider=System.Data.SqlClient;provider connection string="data source=XXX;initial catalog=XXX;user id=XXX;password=XXX;multipleactiveresultsets=True;App=EntityFramework"" 
providerName="System.Data.EntityClient 
+0

Ciò ha funzionato perfettamente nella mia situazione: un'applicazione utilizza due librerie (una specie di architettura di plugin) che includono entrambi un riferimento "ILMerged" alla stessa libreria di modelli. Molte grazie. –

0

ho risolto questo problema in EntityFramework 6.0.

  1. Durante la creazione dei modelli, i nome edmx al nome delle entità. (MYDbEntities)

  2. Dopo la creazione apro MYDbEntities.Context.cs e ho modificato la classe "Entities" in "MYDbEntities".

  3. Aprire l'app.config e cercare la stringa di connessione
  4. Aprire le MYDbEntities.Context.cs e modificare la stringa di connessione a stringa di connessione dal config. esempio "MyDbConnection"
  5. Assicurarsi che la stringa di connessione è come questo

    metadati = res: // /MYDbEntities.csdl|res:// /MYDbEntities.ssdl|res://*/MYDbEntities .msl; provider = System.Data.SqlClient; provider connection string = " origine dati = .; initial catalog = YourDb; persist security info = True; id utente = sa; password = Sw0rdf! sh; multipleactiveresultsets = True; nome applicazione = EntityFramework "

Nota: le mie entità si trovano in una DLL separata.

Spero che questo aiuti.