2017-02-21 96 views
1

У меня возникли проблемы с выяснением того, как перейти от данных формы, содержащих идентификаторы для каждого внешнего ключа, к фактической модели, сделанной с белым NHibernate.Переход от Entity_id к экземпляру объекта в NHibernate

Скажет, например, у нас есть класс:

public class Subcategory 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Name { get; set; } 
    public virtual Category Category { get; set; } 
} 

и это карта:

public SubcategoryMap() 
    { 
     Table("subcategories"); 
     Id(x => x.Id); 
     Map(x => x.Name); 
     References<Category>(x => x.Category); 
    } 

Теперь, когда кто-то сообщение сформировать данные для создания нового Subcategory, он приходит в качестве идентификатора (интермедиат). Я использую Automapper BTW. Что является подходящим методом (с или без Automapper), чтобы перейти от модели, полученной от клиента:

public class SubcategoryDTO 
{ 
    public String Name { get; set; } 
    public int Category_id { get; set; } 
} 

Назад к Subcategory класса выше?

Конечно, я не на самом деле построения запросов к БД, чтобы получить Category в вопросе, присвоить его Subcategory затем сохранить Subcategory ...

Спасибо!

ответ

3

Вы хотите использовать метод Load() в сеансе.

Вот очень старая статья объясняет синтаксис.

https://ayende.com/blog/3988/nhibernate-the-difference-between-get-load-and-querying-by-id

Ключевой кусок

Это как NHibernate поддерживать OO фасада, давая вам те же оптимизации преимущества работы непосредственно с API низкого уровня.

- то, что вам не нужно извлекать и гидратировать весь объект из базы данных.

Синтаксис Load() берет на себя все это.

так

session.Save(new SubCategory { 
    Name = subCategory.Name, 
    Category = session.Load<Category>(subCategory.Category_id) 
}; 

составит 1 поездку в базу данных

Я не думаю, что вы можете достичь этого с помощью Automapper.