我创建了一个产品列表 - 即在代码中手动列出。
是否可以使用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 ?????虽然我在猜测
我希望我能更好地解释自己。
答案 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" />