2009-07-10 3 views
5

devo queste classi:Come utilizzare/mappare una vista del database per popolare una raccolta contenuta?

public class FloorFill 
{ 
    protected FloorFill(){} 
    public virtual ProductCatalog Catalog { get; set; } 
    public virtual Inventory BatchedItem { get; set; } 
    public virtual Transaction Batch { get; set; } 
    public virtual int ItemReference { get; set; } 
    public virtual IList<InventoryLocation> BackstockLocations { get; set; } 
} 
public class InventoryLocation 
{ 
    public InventoryLocation(){} 
    public virtual int Id { get; set; } 
    public virtual int ItemReference { get; private set; } 
    public virtual Location Where { get; set; } 
    public virtual int HowMany { get; set; } 
} 

ho una vista di database che aggrega Items per posizione e qualche altra filtraggio. Vorrei fare riferimento a questa vista nella mappatura per popolare la raccolta FloorFill.BackstockLocations.

Quale approccio dovrei usare per ottenere questa collezione popolato? Mi piacerebbe che la raccolta diventasse pigra, ma a questo punto sarei felice di ricevere i dati.

Qui ci sono i file di mapping:

public class FloorFillMap : EntityBaseMap<FloorFill> 
{   
    public FloorFillMap() 
    { 
     Map(x => x.ItemReference); 
     References(x => x.Catalog, "ProductCatalogId") 
         .WithForeignKey(); 
     References(x => x.Batch, "TransactionId") 
       .WithForeignKey() 
       .Cascade.SaveUpdate(); 
     References(x => x.BatchedItem, "InventoryId") 
       .WithForeignKey() 
       .Cascade.SaveUpdate(); 
     HasMany(x => x.BackstockLocations) 
      .KeyColumnNames.Add("ItemReference") 
      .Inverse() 
      .Cascade.None() 
      .LazyLoad(); 
    } 
} 

public class InventoryLocationMap : ClassMap<InventoryLocation> 
{ 
    public InventoryLocationMap() 
    { 
     WithTable("InventoryLocations"); 
     Id(x => x.Id); 
     References(x => x.Where, "LocationId") 
      .FetchType.Join() 
      .Cascade.None(); 
     Map(x => x.HowMany); 
     ReadOnly(); 
    } 
} 

La query risultante è:

SELECT 
    this_.Id as Id33_0_, 
    this_.Created as Created33_0_, 
    this_.ItemReference as ItemRefe3_33_0_, 
    this_.Modified as Modified33_0_, 
    this_.RowVersion as RowVersion33_0_, 
    this_.ProductCatalogId as ProductC6_33_0_, 
    this_.TransactionId as Transact7_33_0_, 
    this_.InventoryId as Inventor8_33_0_ 
FROM [FloorFill] this_ 

risposta

4

Mappatura di vista è la stessa mappatura di un tavolo, a patto che non si tenta di aggiornare esso.

Cosa stai cercando di fare in questa affermazione?

References(x => x.Where, "LocationId") 
    .FetchType.Join().WithColumns("Id").Cascade.None(); 

Il "LocationId" è il nome della colonna chiave, ma la chiamata WithColumns sovrascriverà tale valore.

un errore o qualche altra indicazione di ciò che sta accadendo o no accadendo aiuterebbe.

+0

ho rimosso il WithColumns ("ID"). L'istruzione select sta confrontando InventoryLocations.ItemRefence con FloorFill.Id e ho bisogno di associarlo a FloorFill.ItemRefence. – Barry

+0

Non si dovrebbe avere WithTableName, che può essere determinato dalla mappa dell'altra entità. Nella tua InventoryLocationMap è necessario rimuovere il ColumnName sul tuo ID come questa è la chiave primaria, e rimuovere la mappa (x => x.ItemReference) perché si sta mappando la vostra chiave esterna come una proprietà. Ora cosa succede? –

+0

Ho modificato l'elenco dei codici per riflettere la mia comprensione delle modifiche suggerite. Questo non sta creando una raccolta di postazioni Backstock. – Barry