5

ho una tabella di database che non posso cambiare, che contiene dati come:Fluent NHibernate - Appiattire più righe in una singola entità

FooTable 
Id  | EntityAUniqueId | EntityBUniqueId | EntityCUniqueId 
============================================================ 
1  | A1    | B1    | C1 
2  | A1    | B1    | C2 
3  | A1    | B2    | C3 
4  | A1    | B2    | C4 
5  | A2    | B3    | C5 
6  | A2    | B3    | C6 
7  | A2    | B4    | C7 
8  | A2    | B4    | C8 

voglio mappare questo per la seguente struttura:

interface IEntityA 
{ 
    string UniqueId { get; } 
    IEnumerable<IEntityB> { get; } 
} 

interface IEntityB 
{ 
    string UniqueId { get; } 
    IEnumerable<IEntityC> { get; } 
} 

interface IEntityC 
{ 
    string UniqueId { get; } 
} 

class EntityA : IEntityA { ... } 
class EntityB : IEntityB { ... } 
class EntityC : IEntityC { ... } 

i dati di cui sopra comporterebbe nei seguenti soggetti tirati:

EnityA(A1) 
    |-EnityB(B1) 
    | |-EntityC(C1) 
    | |-EntityC(C2) 
    |-EnityB(B2) 
     |-EntityC(C3) 
     |-EntityC(C4) 
EnityA(A2) 
    |-EnityB(B3) 
    | |-EntityC(C5) 
    | |-EntityC(C6) 
    |-EnityB(B4) 
     |-EntityC(C7) 
     |-EntityC(C8) 

al momento ho solo bisogno di scrivi al tavolo non letto.

Sto utilizzando FluentNHibernate con AutoMapping e convenzioni.

Ho iniziato a percorrere la strada di Components ma mi sono reso conto che non era quello a cui erano destinati. Una possibile soluzione sarebbe quella di utilizzare tre viste sul tavolo, ma questo aggiunge ulteriori problemi e vorrei evitarlo, se possibile, e non riesco a capire che ci deve essere qualcosa già nel quadro per affrontare questo problema.

Se le interfacce confondono la risposta, sentitevi liberi di ometterle dalla soluzione.

+0

non sai cosa vuoi ottenere qui; puoi spiegare perché hai raccolte di EntityA/B/C? secondo il tuo esempio, sembra che ogni UniqueId abbia esattamente una riga di dati ad essa connessi. o ci sono altre tabelle che non sono menzionate qui? –

+0

@sJhonny Ho aggiornato la domanda – Bronumski

risposta

1

Quindi avete denormalizzato i dati nella vostra tabella. Non so come gestirlo con il tipo di mappatura che stai richiedendo. Posso pensare a 2 soluzioni alternative.

1) Creare viste nel database per normalizzare i dati e creare associazioni su tali viste. Vista come

ViewEntityA 
----------- 
IdColumn: EntityAUniqueId 
AnyDataColumns 

ViewEntityB 
----------- 
IdColumn: EntityBUniqueId 
FkColumn: EntityAUniqueId 
AnyDataColumns 

ViewEntityC 
----------- 
IdColumn: EntityCUniqueId 
FkColumn: EntityBUniqueId 
AnyDataColumns 

È quindi possibile scrivere vista inserimento/aggiornamento/cancellazione logica di trigger (Reference1, Reference 2) per gestire gli aggiornamenti NHibernate.

2) Mappare la tabella così com'è. Mappare manualmente nella gerarchia di oggetti .net in C#. Aggiorna tutte le tabelle del database senza utilizzare le relazioni delle entità di NHibernate.

+0

E 'passato molto tempo da quando ho pubblicato questo e non lavoro più in azienda. Penso che abbiamo usato qualcosa di simile all'opzione 2, ma la vista sarebbe stata un lavoro adeguato, anche se ero davvero per una mappatura fluente di NHibernate. – Bronumski