2009-07-10 5 views
5

J'ai ces classes:Comment utiliser/mapper une vue de base de données pour remplir une collection contenue?

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; } 
} 

j'ai une vue de base de données qui agrège Items par emplacement et un autre filtrage. Je voudrais faire référence à cette vue dans le mappage pour remplir la collection FloorFill.BackstockLocations.

Quelle approche devrais-je utiliser pour obtenir cette collection? Je voudrais pour la collection à la charge paresseuse, mais à ce stade, je serais juste heureux d'obtenir des données.

Voici les fichiers de mappage:

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 requête résultante est:

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_ 

Répondre

4

Cartographie d'un point de vue est le même que le mappage d'une table, tant que vous ne tentez pas de mettre à jour il.

Qu'essayez-vous de faire dans cette déclaration?

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

Le "LocationId" est le nom de la colonne clé, mais l'appel WithColumns écrasera cette valeur.

Une erreur ou une autre indication de ce qui se passe ou ne se passe pas aiderait.

+0

J'ai retiré le WithColumns ("Id"). L'instruction select compare InventoryLocations.ItemRefence à FloorFill.Id et je dois le mapper à FloorFill.ItemRefence. – Barry

+0

Vous ne devriez pas avoir le WithTableName, qui peut être déterminé à partir de la carte de l'autre entité. Dans votre InventoryLocationMap, vous devez supprimer le ColumnName sur votre Id comme étant la clé primaire, et supprimer la Map (x => x.ItemReference) parce que vous mappez votre clé étrangère comme une propriété. Maintenant qu'est-ce qui se passe? –

+0

J'ai modifié la liste de codes pour refléter ma compréhension des modifications que vous avez suggérées. Cela ne crée pas une collection d'emplacements Backstock. – Barry

Questions connexes