Как использовать / отобразить представление базы данных для заполнения содержащейся коллекции? - PullRequest
5 голосов
/ 10 июля 2009

У меня есть эти классы:

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

У меня есть представление базы данных, которое агрегирует Items по местоположению и некоторые другие фильтры. Я хотел бы сослаться на это представление в отображении, чтобы заполнить коллекцию FloorFill.BackstockLocations.

Какой подход я должен использовать, чтобы заполнить эту коллекцию? Я бы хотел, чтобы коллекция загружалась лениво, но на данный момент я был бы рад получить данные.

Вот файлы сопоставления:

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

Результирующий запрос:

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_

1 Ответ

4 голосов
/ 11 июля 2009

Отображение представления аналогично отображению таблицы, если вы не пытаетесь обновить ее.

Что вы пытаетесь сделать в этом утверждении?

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

"LocationId" - это имя ключевого столбца, но вызов WithColumns перезапишет это значение.

Может помочь ошибка или какой-либо другой признак того, что происходит или не происходит.

...