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_
J'ai retiré le WithColumns ("Id"). L'instruction select compare InventoryLocations.ItemRefence à FloorFill.Id et je dois le mapper à FloorFill.ItemRefence. – Barry
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? –
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