FluentNHibernate和基元类型集合

FluentNHibernate和基元类型集合,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我在使用(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.Generi

我在使用(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");
    }
你知道会出什么问题吗? 谢谢

更新



这里是db模式。它是由NH生成的。

有两种方法可以确保您收集的数据被持久化

  • 调用session.Flush()
    会话后保存(一个)。这将导致NHibernate保留您的收藏。可以找到有关刷新的更多信息

  • 将整个事情包装在一个事务中,即

    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的事务进行了广泛的解释。

    这似乎很有趣:我对流利的NH知之甚少。你能发布你的表结构吗?这样我就可以将它与映射进行比较,并查看所有的隐式约定?
    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();
    }