NHibernate:如何将我手动创建的List <product>添加到Nhibernate?</product>

时间:2010-11-11 08:01:53

标签: nhibernate nhibernate-mapping linq-to-nhibernate

我创建了一个产品列表 - 即在代码中手动列出。

是否可以使用nhibernate发送产品列表并自动添加详细信息。

产品类上的属性是数据库上的自动增量ID。

我的定义是这样的

  public virtual int Id { get; set; }

但是当然这是数据库中的自动增量字段,所以我应该在对象(标准c#类)上将其设置为导入到数据库。

如果可以的话。

在我的映射中,我设置了这样的

<class name="Product">
  <id name="Id" column="ProductID">
    <generator class="assigned" />
  </id>
<property name="Name" />
<more property names are here.............>

我认为一定是可能的,但我在理解如何将我的产品型号(List)的集合发送到nhibernate以自动插入时遇到问题

任何帮助真的很感激

修改

我想澄清一下我在做什么..我的产品类基本上就是实体。我已经创建了许多列表中的列表

的产品

因此,我想将BATCH的产品集合插入到数据库中。

并澄清数据库的ProductID字段是自动生成的,因此我将Class'ID设置为从技术上将其插入,数据库将负责此字段。

这是我的属性,代表数据库中的ID

  public virtual int Id { get; set; }

也许我应该将它设置为可空的INT然后我可以将其设置为NULL ?????虽然我在猜测

我希望我能更好地解释自己。

1 个答案:

答案 0 :(得分:2)

<强>更新

将NHibernate视为对象级别的实体持久性是有帮助的。它不是一个强大的批量数据加载器/操纵器(我不知道ORM是什么)。

所以给出你的例子,正确的做法是为列表中的每个项目调用Session.SaveUpdate。因此,假设您可以访问NHibernate Session对象,只需调用:

foreach(Product p in ProductList){
  Session.SaveOrUpdate(p);
}

我个人通常将这个逻辑包装到存储库中(我通常使用存储库模式),例如:

public void SaveOrUpdateAll(IEnumerable<Product> products){
  foreach(Product p in products){
    Session.SaveOrUpdate(p);
  }
}

关于你的第二个问题:如何处理Id?这很简单,保留Id原样。 int类型不能为null,因此将其初始化为0.这足以告诉NHibernate该实体尚未保留在数据库中并且将被添加(这是一个额外的奖励,您的产品将其Id设置为自动生成调用SaveOrUpdate方法后的数据库密钥。

有趣的是,NHibernate在使用SaveOrUpdate方法在数据库中创建新记录或根据此数字是否为&gt;更新现有记录时做出决定。 0(即已分配)。

这取决于您的映射是否正确,因此您的生成器必须如下:

<generator class="identity" />