我在使用(流畅)NHibernate持久保存原始类型集合时遇到问题。
这是实体和映射:
public class SomeOne
{
public virtual long ID { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual Iesi.Collections.Generic.ISet<string> Foo { get; protected set; }
public SomeOne()
{
Foo = new HashedSet<string>();
}
}
public SomeOneMap()
{
Id(x => x.ID).GeneratedBy.Identity();
Map(x => x.Name);
Map(x => x.Description);
HasMany(x => x.Foo).Element("Code").AsSet().Not.Inverse();
Table("SomeTypeOne");
}
但是,当我尝试保存SomeOne实例时,关联的Foo字符串会被忽略。
var session = factory.OpenSession();
var one = new SomeOne();
one.Foo.Add("Dato");
one.Foo.Add("Mari");
session.Save(one);
知道可能出现什么问题吗? 感谢
更新
这是db架构。它由NH生成。
答案 0 :(得分:2)
有两种方法可以确保收集的内容保持不变。
session.Flush();
后致电session.Save(one);
。这将导致NHibernate持久保存您的收藏。有关同花顺的更多信息可以在here找到。
将整件事物包裹在交易中,即
using (var session = factory.OpenSession())
using (var transaction = session.BeginTransaction())
{
var one = new SomeOne();
one.Foo.Add("Dato");
one.Foo.Add("Mari");
session.Save(one);
transaction.Commit();
}
选项二优于选项一有几个原因。主要优点是所有对象都在同一事务中保存回DB,因此如果一个插入失败,则事务将回滚,并且您的DB不会处于不一致状态。对此question的加速答案有一个广泛的解释,说明为什么要使用NHibernate进行交易。