NHibernate спасение "среднего человека" имеет много ассоциаций - PullRequest
0 голосов
/ 26 октября 2010

У нас есть Продукт , Категория и ProductToCategory классы.

A продукт имеет много ProductToCategories , в категории есть много ProductToCategories .

Продукт включает это свойство

public virtual IList<ProductToCategory> Categories { get; set; }

ProductToCategory

public class ProductToCategory : Entity
{        
    public virtual Product Product { get; set; }        
    public virtual Category Category { get; set; }
    public virtual bool IsFeatured { get; set; }
}

Категория включает эти свойства

    public virtual Category Parent { get; set; }
    public virtual IEnumerable<Category> Children { get; set; }
    public virtual IEnumerable<ProductToCategory> Products { get; set; }

Нам нужен явный класс ProductToCategory, потому что нам нужно логическое свойство для отношений между продуктами и категориями, чтобы определить, должен ли этот продукт быть представлен на главной странице категории.

Для отображения всего этого используется Fluent NHibernate AutoMapping с некоторыми переопределениями

Переопределение сопоставления продуктов

mapping.HasMany(x => x.Categories)
  .Cascade.AllDeleteOrphan()
  .Inverse();

Переопределение отображения категории

mapping.HasMany(x => x.Children)
  .Cascade.AllDeleteOrphan()
  .KeyColumn("ParentId");

mapping.References(x => x.Parent).Column("ParentId");

Переопределение сопоставления товаров в категории

mapping.References(x => x.Category);

Когда я хочу сохранить продукт, мне нужно, чтобы NHibernate удалил все существующие категории ProductToCategories, связанные с продуктом, и добавил те, которые были переданы из пользовательского интерфейса, а также обновил другие свойства продукта, такие как имя, номер детали и т. Д. .

Какой самый краткий способ гарантировать, что NHibernate сохраняет изменения в Продукте (включая связанные ProductToCategories), когда предоставляется экземпляр моего класса Product.

1 Ответ

0 голосов
/ 13 июля 2011

Если экземпляр продукта, поступающий из пользовательского интерфейса, не связан с сеансом nhibernate, но является постоянным объектом (имеет действительное удостоверение), то session.Merge(instance) или session.SaveOrUpdateCopy(instance) должны решить эту проблему. Они получат копию этой сущности из БД и сохранят изменения между вашим экземпляром и экземпляром БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...