2013-03-25 9 views
7

Il problemaIl tipo 'System.Data.Linq.DataContext' è definito in un assembly che non si fa riferimento

errore quando si va a una pagina specifica (in eseguire il debug locale): CS0012: Il sistema di tipo ' .Data.Linq.DataContext 'è definito in un assembly a cui non viene fatto riferimento. È necessario aggiungere un riferimento all'assembly 'System.Data.Linq, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089'.

Qui ci sono le righe di codice di riferimento nel messaggio di errore:

Linea 28:
Linea 29:
Linea 30: public class _Page_Views_blah_granny_cshtml: System.Web.Mvc.WebViewPage {
Linea 31:
Riga 32: #linea nascosta

Tutte le altre pagine funzionano in modo ottimale - questo accade solo quando si accede a una pagina in particolare. Il riferimento funziona su tutte le altre pagine. Per quanto sono in grado di determinare, questo non è un problema con il riferimento.

Ho trascorso un buon periodo di tempo alla ricerca di questo problema.

Tutte le risposte che ho trovato suggerivano di andare a web.config e inserire un riferimento all'assembly a linq in system.web> configuration> assembly. Il mio non ha assemblaggi elencati e ho il sospetto che questo è più per le versioni precedenti. L'ho fatto lo stesso. Mi ha dato un altro errore dicendo che non ha idea di cosa fare con gli assembly.

Ho eliminato system.data.linq e l'ho aggiunto di nuovo.

Ho riavviato sia VS che il mio computer.

Il mio codice - come generato per impostazione predefinita da VS - ha System.Linq.

Background - Ecco come questo è cominciato:

L'applicazione è MVC 4, C#.

Ho creato una nuova classe nel mio DataContext, aggiunto un nuovo controller e creato una vista fortemente tipizzata.

Ecco un codice molto simile (probabilmente non necessario, ma nel caso).

due classi:

public class granny { 
      public string data { get; set; } 
      public string criteria { get; set; } 
} 

public List<granny> getGranny() { 
    var a = from x in grannytable 
      join dx in anothertable 
      on x.criteria equals dx.criteria 
      select new granny { 
       data = x.somenewdata; 
      }; 
    return a.ToList(); 
} 

Ecco il controllore:

public ActionResult granny() { 
     return View(db.getGranny()); 
    } 

Niente di speciale qui.

La pagina è una tipica vista a rasoio, fortemente digitata "Elenco" ... ha una tabella che itera creando, scaricando i dati man mano che procede.

Sono felice di fornire qualsiasi codice aggiuntivo, se necessario.

Non ho problemi con web.config. Non ho rimosso o ottimizzato nessuno dei riferimenti sulle pagine. Tutte le altre visualizzazioni funzionano meravigliosamente.

Quando lo eseguo localmente, e provo ad andare su/nonna, ottengo l'errore sopra riportato.

Grazie per il vostro aiuto!

LA SOLUZIONE: Sono entrato in riferimenti e per System.Linq (o per versioni precedenti, suppongo, System.Data.Linq) e ho cambiato CopyLocal su True.

+0

Dimenticando gli assembly nel file di configurazione, il tuo progetto non ha solo un set di riferimenti "normale"? (In Solution Explorer, c'è un elemento References?) –

+0

Esiste sicuramente. Fa riferimento a System.Data.Linq. Ho rimosso il riferimento e l'ho aggiunto, pensando che qualcosa fosse stato appeso lì. Sto usando .NET System.Data.Linq incluso. Punta a C: \ Programmi \ Assiemi di riferimento \ Microsoft \ Framework \ .NETFramework \ v4.0 \ System.Data.Linq.dll come dovrebbe. Vale la pena notare che le mie altre pagine stanno usando linq bene. Non penso che sia un problema di riferimento linq, perché non è un problema gregario - è solo questa una pagina. – shubniggurath

+1

puoi fornire una soluzione completa o un progetto che dimostri il problema? – Phil

risposta

21

questo ha funzionato per me:

  • Passare al nodo riferimenti del progetto web
  • Trova il riferimento alla System.Data.Linq
  • Aprire la finestra Proprietà VS
  • Nella finestra delle proprietà, cambia Copia locale: False a True

Prima di ciò, System.Data.Linq.dll non veniva copiato nel cestino di canonica. (Copiandolo manualmente nella directory bin ha risolto anche l'errore)

+0

+1 Nice one. Questo ancora regge un anno dopo. Per chiunque altro, ho sperimentato questo con il controller WebApi di Umbraco 7 quando si utilizza un contesto di dati dbml. Copia locale come descrive Chris fa il trucco. Cheers –

+1

Perché funziona? Non dovrebbe essere comunque disponibile "System.Data.Linq.dll" se è referenziato? –

+0

Probabilmente dovrebbe. Il bug, suppongo, è che è stato contrassegnato Copy Local: False. Non so come succede –

7

provo ad aggiungere @using System.Data.Linq nella parte superiore della visualizzazione problema e <add namespace="System.Data.Linq" /> in <pages> sezione del web.config nella cartella Visualizzazioni.

8

MVC non può compilare la vista al volo. Sembra che la tua vista contenga un riferimento a un DataContext. L'aggiunta di un riferimento nel web.config dovrebbe dire al compilatore di cercare il file:

<configuration> 
<system.web> 
    <compilation targetFramework="4.0"> 
    <assemblies> 
     <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
    </assemblies> 
</compilation> 

Nota: l'assemblea deve essere aggiunto sotto l'elemento di compilazione.

Puoi condividere la vista, il controller e il codice datacontext?

+0

Gli assembly non devono essere aggiunti in MVC 4. – shubniggurath

Problemi correlati