1

我在使用 (Fluent)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);

知道有什么问题吗?谢谢

更新


这是数据库模式。它是由 NH 生成的。在此处输入图像描述

4

1 回答 1

2

有两种方法可以确保您收集的内容被持久化。

  1. session.Flush();之后调用session.Save(one);。这将导致 NHibernate 持久化您的集合。更多关于冲洗的信息可以在这里找到。

  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();
    }
    

选项二优于选项一的原因有很多。主要优点是所有对象都在同一个事务中保存回数据库,因此如果一个插入失败,则事务将回滚并且您的数据库不会处于不一致状态。这个问题的公认答案对为什么应该使用 NHibernate 的事务进行了广泛的解释。

于 2013-03-19T22:03:21.310 回答