2017-02-06 53 views
0

У меня есть продукты стол:Как извлечь один столбец из другой таблицы, используя Fluent NHibernate

ProductId
ProductDescription
CategoryId

И Категории стол:

CategoryId
CategoryDescription

*** Для каждого продукта, я хотел бы, чтобы отобразить строку так:

Id продукта | Описание продукта | Категория Описание

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

Продукты Mapping Я использую:

public ProductsMap() 
{ 
    Table("Products"); 

    Id(x => x.ProductId); 
    Map(x => x.ProductDescription); 
    Map(x => x.CategoryId); 

    References(x => x.Categories) 
     .Column("CategoryId") 
     .Not.Nullable(); 

    // Need Join() statement here? 
    ... 

Мой Продукты Класс:

public class Products 
{ 
    public virtual int ProductId { get; set; } 
    public virtual string ProductDescription { get; set; } 
    public virtual int CategoryId { get; set; } 
    public virtual Category Category { get; set; }   
    public virtual int? CategoryDescription { get; set; } // Not in the db table. 
} 

Моя цель состоит в том, чтобы иметь CategoryDescription поле в класс выше будет заполняться автоматически Fluent -NHibernate через указанное отображение.

Я использовал join заявление, предложенное this answer, но я получил различные исключения для следующего утверждения:

List<Products> products = session.Query<Products>().ToList(); 

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

Я новичок в Fluent-NHibernate, потратил немало времени на это, но чувствую, что я никуда не денусь. Буду признателен за руководство.

ответ

1

Я немного смущен, потому что вы, кажется, смешением единственного и множественного числа, но я хотел бы создать отдельные сопоставления домена для продукта и категории

public class Product 
{ 
    public virtual int ProductId { get; set; } 
    public virtual string ProductDescription { get; set; } 
    public virtual Category Category { get; set; } 
} 

public class Category 
{ 
    public virtual int CategoryId { get; set; } 
    public virtual string CategoryDescription { get; set; } 
} 

карте их так, как вы отображающую в этом вопросе, то создать модель представления

public class ProductViewModel 
{ 
    public virtual int ProductId { get; set; } 
    public virtual string ProductDescription { get; set; } 
    public virtual string CategoryDescription { get; set; } 
} 

, который получает заполняется с этим запросом

 var products = session.Query<Products>().Select(p => new ProductViewModel() 
     { 
       ProductId = p.ProductId, 
       ProductDescription = p.ProductDescription, 
       CategoryDescription = p.Category.CategoryDescription 
     }); 

Это вызовет запрос, который возвращает только нужные столбцы. Если вы вернете полные объекты, вы вернете информацию, которая вам не нужна.

+0

Огромное спасибо! Оно работает. Теперь я должен понять, как ** это работает! :) Любые хорошие ресурсы, которые вы можете предложить на Fluent-NHibernate? – Sabuncu

+0

PS: Мне пришлось использовать этот ответ: http://stackoverflow.com/a/3402839/360840, чтобы решить проблему с литьем, но кроме этого, это было прекрасно. – Sabuncu

+0

Да, запрос, который я включил, вернет IQueryable. ToList(), ToArray(), ... запустит запрос, заполнив список. – Fran