2012-05-11 4 views
9
The type 'System.ComponentModel.DataAnnotations.MaxLengthAttribute' 
exists in both 

[path...]\packages\EntityFramework.4.3.1\lib\net40\EntityFramework.dll 

and 

'c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework 
\.NETFramework\v4.5\System.ComponentModel.DataAnnotations.dll' 

Ora, ho letto on msdn che la sua sicurezza per escludere il riferimento EntityFramework (che è stato aggiunto attraverso il pacchetto NuGet). Tuttavia, quando lo faccio, non posso creare un DBContext correttamente come la classe DbModelBuilder vive nella dll EntityFramework. Inoltre, mancano alcune altre classi critiche quando rimuovo la refferenza EntityFramework, quindi questa è una soluzione vecchia e irrilevante ora.MaxLength attributo in EF4.3.1

Update (disambigua): Sia System.ComponentModel.DataAnnotations.dll e EntityFramework.dll includono System.ComponentModel.DataAnnotations.MaxLengthAttribute. Il problema è che ogni DLL include anche altre classi che sono fondamentali per la progettazione del codice EF prima. Per esempio:

EntityFramework.dll: 
- System.Data.Entity.DbModelBuilder 

System.ComponentModel.DataAnnotations.dll: 
- System.ComponentModel.DataAnnotations.RegularExpressionAttribute 

risposta

14

aggiungere questa istruzione al top della classe

using System.ComponentModel.DataAnnotations; 

System.ComponentModel.DataAnnotations namespace è distibuted attraverso il EntityFramework.dll e System.ComponontModel.DataAnnotations.dll. Quindi è necessario aggiungere un riferimento a entrambi nel progetto per utilizzare DataAnnotations.

L'attributo MaxLenth è presente in EntityFramework.dll. Quindi assicurati di avere quel riferimento a quella dll presente nella sezione dei riferimenti del tuo progetto.

enter image description here

EDIT: Come di .NET Framework 4.5, questo spazio dei nomi viene spostato nella System.ComponentModel.DataAnnotations.dll. Quindi, se si utilizza .NET Framework 4.5 con Entity Framework 4.3.1 o meno, si eseguirà questo conflitto. La soluzione è passare alla versione beta 1/2 di Entity framework 1.50 se si desidera attenersi a .NET 4.5 o eseguire il downgrade a .NET 4 per utilizzare EntityFramework 4.3.1.

Dai documenti msdn.

A partire da Entity Framework 5.0 Beta 1, l'EntityFramework.dll non contiene definizioni per le annotazioni di dati. Queste definizioni sono state spostate in System.ComponentModel.DataAnnotations.dll e sono definite nello spazio dei nomi System.ComponentModel.DataAnnotations.Schema.

+0

Grazie per la risposta, ma per favore leggi di nuovo la domanda. Il problema che ho è che ho bisogno di entrambe le DLL, e ho il refference e il set di istruzioni using, ma questo crea un conflitto. System.ComponentModel.DataAnnotations.MaxLengthAttribute è anche presente in System.ComponentModel.DataAnnotations.dll. Ill modifica per includere quella informazione –

+0

@MihalisBagos: ho avuto il tuo problema. È perché .NEt 4.5 ha questo spazio dei nomi all'interno di DataAnnotations.dll. Quindi dovresti cambiare la tua versione EF in base a quello. Vedi la mia risposta aggiornata. – Shyju

+0

Doh ora ha senso, grazie! Stavo cercando di capire cosa ho sbagliato ... Il comando per il pacchetto nuget è Install-Package EntityFramework -Pre per quello che vale –

6

non ho avuto la possibilità di aggiornare il progetto di utilizzare EF5, o il downgrade la macchina build per .Net Framework 4.

C'è un modo per risolvere questo però! Risulta quando si installa Visual Studio 2012 si aggiunge la seguente cartella (tra gli altri).

C: \ Program Files \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0

In VS, se si apre un progetto rivolte a 4.0 e guardano le proprietà del riferimento alla System.ComponentModel .DataAnnotations vedrai che il percorso punta alla posizione sopra, piuttosto che al GAC.

Questa cartella contiene gli assembly di Framework 4.0 originali. Se sono presenti sulla macchina, MSBuild, ecc., Alla costruzione di un progetto con targeting 4.0 farà riferimento a questi anziché a quelli modificati che 4.5 inserisce nel GAC.

Nel nostro caso ciò significava che potevamo risolvere il problema copiando quella cartella da una macchina di sviluppo con VS installato sul nostro server di build nella stessa posizione. (N.B. Abbiamo solo bisogno di copiare questa cartella, non c'era bisogno di installare VS sul server di build).

Maggiori informazioni qui: http://marcgravell.blogspot.co.uk/2012/09/iterator-blocks-missing-methods-and-net.html

Spero che questo aiuti qualcun altro!