Нужно ли реализовывать методы добавления / удаления в моих сущностях NHibernate? - PullRequest
1 голос
/ 08 января 2011

Это образец с сайта Fluent NHibernate:

По сравнению с Entitiy Framework у меня есть методы ADD в моем POCO в этом примере кода с использованием NHibernate. С помощью EF я сделал context.Add или context.AddObject и т. Д. ... у контекста были методы для помещения одной сущности в коллекцию других сущностей!

Действительно ли мне нужно реализовать методы добавления / удаления / обновления (я не имею в виду реальные операции CRUD базы данных!) В сущности NHibernate?

public class Store
{
  public virtual int Id { get; private set; }
  public virtual string Name { get; set; }
  public virtual IList<Product> Products { get; set; }
  public virtual IList<Employee> Staff { get; set; }

  public Store()
  {
    Products = new List<Product>();
    Staff = new List<Employee>();
  }

  public virtual void AddProduct(Product product)
  {
    product.StoresStockedIn.Add(this);
    Products.Add(product);
  }

  public virtual void AddEmployee(Employee employee)
  {
    employee.Store = this;
    Staff.Add(employee);
  }
}

Ответы [ 2 ]

1 голос
/ 08 января 2011

Вам не нужно делать это для nhibernate, вы должны делать это для сохранения согласованности в памяти и не повторяться.

Согласованность в памяти

Если у вас двусторонние отношения, допустим, у Порядка есть Линии, а у Линии отношение к заказу.Вы не хотите иметь ссылку с одной стороны, а не с другой.Если вы просто сделаете:

order.Lines.Add(line);

Вы сделали ссылку из Order to Line, но свойство Line.Order остается нулевым.Так что ваши экземпляры в памяти не согласованы.

Не повторяйте себя

Вы можете использовать следующий код: order.Lines.Add (line);line.Order = order;

, но вы будете повторяться, поэтому лучше поместить этот код только в одном месте, и лучшее место - как order.AddLine (..).

1 голос
/ 08 января 2011

У вас нет до. Вы можете просто позвонить SomeStore.Products.Add(someProduct) прямо из-за пределов вашей сущности. Но часто бывает полезно сделать коллекции доступными только для чтения с общедоступной точки зрения и использовать метод добавления в сущности для добавления элементов.

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

Это на самом деле не вещь NHibernate, а скорее вещь ООП. (Хотя я не знаком с EF - возможно, он автоматизирует некоторые из них для вас). Дизайнерские решения точно такие же, как если бы это был просто непокрытый poco (без NHibernate).

...