NHibernate однонаправленные ассоциации - PullRequest
0 голосов
/ 02 сентября 2011

Игра с проектом Fluent NHibernate Getting Started . Я попытался немного изменить пример, по нескольким причинам, среди которых исключение циклической ссылки для сериализации json.

Что я сделал, так это убрал классы Store и StoreMap своих ссылок обратно на классы Employee и Product. Теперь это выглядит так:

Магазин / StoreMap

public class Store
{
   public virtual int Id { get; private set; }
   public virtual string Name { get; set; }
}
public StoreMap()
{
   Id(x => x.Id);
   Map(x => x.Name);
}

Служащий / EmployeeMap

public class Employee
{
  public virtual int Id { get; private set; }
  public virtual string FirstName { get; set; }
  public virtual string LastName { get; set; }
  public virtual Store Store { get; set; }
}

public class EmployeeMap : ClassMap<Employee>
{
  public EmployeeMap()
  {
    Id(x => x.Id);
    Map(x => x.FirstName);
    Map(x => x.LastName);
    References(x => x.Store).Cascade.All();
  }
}

Продукт / ProductMap

public class Product
{
  public virtual int Id { get; private set; }
  public virtual string Name { get; set; }
  public virtual double Price { get; set; }
  public virtual IList<Store> StoresStockedIn { get; private set; }

  public Product()
  {
    StoresStockedIn = new List<Store>();
  }

  public virtual void StockAt(Store store)
  {
    StoresStockedIn.Add(store);
  }
}

public class ProductMap : ClassMap<Product>
{
  public ProductMap()
  {
    Id(x => x.Id);
    Map(x => x.Name);
    Map(x => x.Price);
    HasManyToMany(x => x.StoresStockedIn)
      .Cascade.All()
      .Table("StoreProduct");
  }
}

Я переместил операции "Каскад" в Product и Employee вместо Store. Судя по результатам тестирования, ассоциации HasMany и HasManyToMany работают нормально.

Мой вопрос: правильный ли это подход? Приведет ли это к чему-то, чего я не ожидал.

1 Ответ

0 голосов
/ 02 сентября 2011

Насколько я знаю, это стандартная практика в nHibernate иметь оба конца отношений в ваших классах модели (на самом деле, это обычно имеет смысл с точки зрения бизнеса).
Хотя вы этого не делаете должен сделать это (я думаю, что ваш пример должен работать нормально).
Если вы не хотите выставлять один (или оба) конца, вы всегда можете определить их как частные или защищенные.

ps относительно сериализации json: сериализовывать объекты модели не рекомендуется.это по нескольким причинам, главными из которых являются:
1. данные, которые вы отображаете пользователю, могут отличаться от данных, имеющихся у вас (например, вы можете захотеть представить сотрудника с его именем, Id, название их магазина и количество принадлежащих им продуктов. Было бы трудно сделать это, используя классы вашей модели).
2. вполне возможно, что у вас будут неинициализированные коллекции в ваших объектах (если вы используете отложенную загрузку),Они не сериализуются.

Для сериализации рекомендуется использовать DTO.

...