Domanda

Ho un'entità che mappa a una tabella chiamata regola. La tabella per questa entità ha un FK a un'altra tabella chiamata categoria. Sto cercando di capire come attirare una proprietà dalla categoria nell'entità della mia regola. Sono abbastanza sicuro di voler usare un join nella mia mappatura delle entità, ma non riesco a capire come configurarlo in modo che funzioni. Ecco la mia mappatura:

Join("Category", x => 
{
    x.Map(i => i.CategoryName, "Name");
    x.KeyColumn("CategoryId");
    x.Inverse();
});

Ecco l'SQL che sta generando ...

SELECT ...
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.Id=rules0_1_.CategoryId
WHERE ...

Ecco il SQL che voglio.

SELECT ...
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.CategoryId=rules0_1_.Id
WHERE ...

Non riesco a trovare nulla sulla parte che mi permetta di fare questo. Subselect sembra promettente dal piccolo po 'di documentazione che ho trovato, ma non riesco a trovare esempi su come usarlo. Qualsiasi consiglio su questo problema sarebbe molto apprezzato. Grazie!

È stato utile?

Soluzione

"Join" è male nominato. Un "join" in una mappatura nhibernata implica una relazione zero-to-uno basata su una relazione delle chiavi primarie delle due tabelle. Utilizzeresti un join se, ad esempio, avessi una tabella utente e una tabella UserAdditionalInfo, con zero o un record per utente. La tabella UserAdditionalInfo farebbe probabilmente fare riferimento al PK dall'utente sia come chiave esterna che come chiave principale. Questo tipo di cose è comune quando un DBA deve mantenere religiosamente uno schema per un'app legacy, ma una nuova app ha bisogno di nuovi campi per lo stesso record concettuale.

Ciò di cui hai effettivamente bisogno nella tua situazione è una relazione di riferimenti, in cui un record ha una relazione chiave straniera con zero o altri record. Lo imposteresti fluentemente così:

References(x=>Category)
    .Column("CategoryId")
    .Inverse()
    .Cascade.None();

Il problema è che la categoria deve ora essere mappata; È un'entità separata che ora è correlata alla tua. Le tue opzioni sono vivere con questo modello, "appiattirlo" rendendo privato l'entità, cambiando la mappatura per accedere all'entità come tale e codificando "pass-throughs" alle proprietà che desideri pubblico o utilizzando un codice Strumento come Automapper per proiettare questo modello di dominio profondo in un DTO piatto in fase di esecuzione per uso generale. Tutti hanno pro e contro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top