FluentNHibernate和原始类型集合

时间:2013-03-18 11:20:05

标签: nhibernate fluent-nhibernate

我在使用(流畅)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生成。enter image description here

1 个答案:

答案 0 :(得分:2)

有两种方法可以确保收集的内容保持不变。

  1. session.Flush();后致电session.Save(one);。这将导致NHibernate持久保存您的收藏。有关同花顺的更多信息可以在here找到。

  2. 将整件事物包裹在交易中,即

    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();
    }
    
  3. 选项二优于选项一有几个原因。主要优点是所有对象都在同一事务中保存回DB,因此如果一个插入失败,则事务将回滚,并且您的DB不会处于不一致状态。对此question的加速答案有一个广泛的解释,说明为什么要使用NHibernate进行交易。