Domanda

Sto lavorando con alcune tabelle legacy che hanno relazioni, ma tali relazioni non sono state impostate esplicitamente come chiavi primarie / esterne. Ho creato un file .dbml usando " Classi da Linq a SQL " e stabilito l'associazione Case.CaseID = CaseInfo.CaseID corretta. La mia classe risultante è CasesDataContext.

I miei tavoli (da uno a molti):

Case
------------------
CaseID (int not null)
MetaColumn1 (varchar)
MetaColumn2 (varchar)
MetaColumn3 (varchar)
...


CaseInfo
------------------
CaseInfoID (int)
CaseID (int nulls allowed)
CaseInfoMeta (varchar)
...

Sono nuovo di LinqToSQL e ho problemi a fare ..

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            where c.CaseInfo.CaseInfoMeta == "some value"
            select c;

(Modifica) Il mio problema è che CaseInfo o CaseInfos non è disponibile come membro di Casi.

Ho sentito da un collega che avrei potuto provare ADO.Net Entity Data Model per creare la mia classe di contesto dei dati, ma non l'ho ancora provato e volevo vedere se avrei perso tempo o avrei dovuto seguire un'altra strada . Eventuali suggerimenti, collegamenti, aiuto sarebbero molto apprezzati.

È stato utile?

Soluzione

Torna al designer e verifica che la relazione sia impostata correttamente. Ecco un esempio di vita reale, con BillStateMasters ha " CustomerMasters1 " proprietà (clienti per lo stato): alt text

Ps. la denominazione viene ripulita ...

Aggiornamento 1: devi anche assicurarti che entrambe le tabelle abbiano un primario definito. Se la chiave primaria non è definita nel database (e non può essere definita per qualsiasi motivo), assicurarsi di definirli nella finestra di progettazione. Apri le proprietà della colonna e impostala come chiave primaria. Detto questo, anche il rilevamento delle entità non funzionerà se non si dispone di una chiave primaria per l'entità, il che per l'eliminazione significa che non aggiorna silenziosamente l'entità. Quindi, assicurati di rivedere tutte le entità e di averle tutte con una chiave primaria (come ho detto, se non può essere sul db, quindi sul designer).

Altri suggerimenti

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            join ci in db.CaseInfo on
            ci.ID equals c.InfoID
            where ci.CaseInfoMeta == "some value"
            select new {CASE=c, INFO=ci};

my " join " linq è un po 'arrugginito, ma quanto sopra dovrebbe avvicinarsi a ciò che stai cercando.

L'associazione è impostata su Uno a Uno o Uno a Molti? Se l'associazione è impostata su Da uno a molti, allora quello che hai è un EntitySet, non un EntityRef e dovrai usare una clausola where sull'insieme dipendente per ottenere il valore corretto. Sospetto che tu voglia una relazione One to One, che non è l'impostazione predefinita. Prova a cambiarlo in Uno a uno e vedi se riesci a costruire la query.

Nota. Sto solo indovinando perché in realtà non ci hai detto quale sia il "problema". in realtà lo è.

La tua query sembra corretta e dovrebbe restituire un set di risultati della query di oggetti Case.

Quindi ... qual è il problema?

  

(Modifica) Il mio problema è che CaseInfo   non è disponibile in Casi ... ad es.   c.CaseInfo non esiste dove sono   supponendo che sarebbe se ci fossero   chiave primaria / esterna esplicita   relazioni.

Che cosa intendi con "non disponibile"? Se hai creato l'associazione nel designer come hai detto, la query dovrebbe generare qualcosa di simile a SQL

SELECT [columns] 
FROM Case INNER JOIN CaseInfo 
   ON Case.CaseID = CaseInfo.CaseID
WHERE CaseInfo.CaseInfoMeta = 'some value'

Hai eseguito il debug della tua query linq per generare ancora l'SQL? Cosa restituisce?

Un paio di cose che potresti voler provare:

Controlla le proprietà dell'associazione. Assicurarsi che la proprietà Parent sia stata creata come pubblica. Lo fa per impostazione predefinita, ma qualcosa potrebbe essere cambiato.

Dato che non stai ottenendo CaseInfo su C, prova a digitarlo nell'altra direzione per vedere se ottieni ci.Case con intellisense.

Elimina e ricrea l'associazione tutti insieme.

C'è qualcosa di molto basilare che non funziona se i membri secondari non si presentano. Potrebbe essere meglio eliminare il dbml e ricreare il tutto.

Se tutto il resto fallisce, passa a NHibernate. :)

Dopo alcuni test, sono abbastanza sicuro che le relazioni FK siano richieste nel DB indipendentemente dalle associazioni create in Linq-to-SQL. cioè se non li hai impostati esplicitamente nel DB, allora dovrai fare un join manualmente.

È questo c #? Penso che tu abbia bisogno di == invece di = su questa riga:

where c.CaseInfo.CaseInfoMeta = "some value"

dovrebbe leggere

where c.CaseInfo.CaseInfoMeta == "some value"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top