我是否必须在NHibernate实体中实现添加/删除方法?

时间:2011-01-08 09:16:58

标签: nhibernate methods entity add

这是来自Fluent NHibernate网站的样本:

与Entitiy Framework相比,我在使用NHibernate的代码示例中的POCO中有ADD方法。使用EF我做了context.Add或context.AddObject等...上下文有方法将一个实体放入其他实体集合中!

我真的必须在NHibernate实体中实现添加/删除/更新方法(我不是指真正的数据库CRUD操作!)?

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 个答案:

答案 0 :(得分:1)

你没有拥有。您可以直接从实体外部拨打SomeStore.Products.Add(someProduct)。但是,从公共角度对集合进行“只读”,并在实体中使用add方法添加项目通常是一种很好的做法。

这样做的一个好处是你可以在那里添加额外的逻辑。例如,在你的商店示例中,你可以在同一个方法中设置'storesStockedIn'集合(如果有这样的东西),所以保留所有关于在一个地方创建该关系的逻辑。

这不是一个真正的NHibernate,而是一个OOP的东西。 (虽然我不熟悉EF - 也许它会为你自动化一些)。设计决策与仅仅是一个未经加工的poco(没有NHibernate)完全相同。

答案 1 :(得分:1)

你不必为nhibernate这样做,你必须这样做才能保持内存中的一致性,不要重复自己。

记忆中的一致性

如果你有双向关系,可以说Order有Lines,Line是要订购的关系。您不希望从一方而不是另一方获得引用。 如果您这样做:

order.Lines.Add(line);

您已从Order转到Line,但Line.Order属性仍为null。因此,您的内存中实例不一致。

不要重复自己

您可以使用以下代码: order.Lines.Add(线); line.Order = order;

但是你会重复自己,所以最好把这些代码放在一个地方,最好的地方是order.AddLine(..)。