这是来自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);
}
}
答案 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(..)。